Java中父子线程之间的通信

时间:2013-05-06 11:44:37

标签: java multithreading sockets

我有一个主线程,在该线程中我开始一个新线程。 (子线程)。该子线程打开服务器套接字并开始侦听连接。 我希望该线程停止执行并关闭它初始化的任何内容(如Socket),当主线程从外部获取消息时(从那里得到消息不是关注点)。我应该如何停止线程并关闭所有连接是我想要的。

我应该使用共享变量吗?这样当主线程收到消息时它应该修改它,子线程应该不断检查该共享变量的变化吗?

我该如何实施?一些有用的链接可能有帮助或示例代码?

我尝试的内容如下: 我在主线程中声明了一个变量

 flag=0;

当主线程收到消息时,它会设置

flag = 1 ;

并且线程按如下方式侦听更改:

  void ()run{

       while(true){

            if(flag==1){
                   break;
              }

       sock1 = Ssocket.accept(); 
  }

但上面的代码根本不起作用。我该怎么办?

4 个答案:

答案 0 :(得分:6)

中断线程的正确方法是通过中断机制。在主线程中,当您想要停止子线程时,请调用:

childTread.interrupt();

并在子线程中,您执行以下操作:

public void run() {
    try {
        while (!Thread.currentThread.isInterrupted) {
            sock1 = Ssocket.accept();
            //rest of the code here
        }
    } catch (InterruptedException e) {
        Thread.currentThread.interrupt(); //good practice
    }
    //cleanup code here: close sockets etc.
}

请注意,Ssocket.accept不可中断,因此如果您想阻止它等待,您必须从外面关闭它,强制它抛出IOException

答案 1 :(得分:3)

<强> Child thread

你应该在这里创建一个新函数,f.e:

public void setFlag(int i)
  {
     flag = i;
  }

<强> Parent Thread

每当你想在子线程中杀死/停止监听/ ...时,请拨打:

 childThread.setFlag(1);

如果您不需要将子线程设为匿名,请创建 ChildThread

 public ChildThread implements Runnable
{
    private int flag = 0;

    public ChildThread()
     {  }

    public void setFlag(int i)
      {
         flag = i;
      }
    public void run()
      { 
       //your code
      }
    ....
}

答案 2 :(得分:0)

如果使用标志来表示线程停止,请确保读/写访问是同步的。例如:


   public synchronized void cancel ()
   {
       stop = true;
   }

   protected synchronized boolean cancelRequested ()
   {
       return stop;
   }

答案 3 :(得分:-1)

使用您自己的实现扩展Runnable

public class StoppableRunnable extends Runnable {

}

对您的课程进行编码,以便您可以停止Runnable的执行,您将在How to properly stop the Thread in Java?找到一个很好的示例。请务必查看前两个答案

在相当于terminate()功能的情况下,执行所有清理工作