Java中父子线程之间的通信

nee*_*rle 7 java sockets multithreading

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

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

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

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

 flag=0;
Run Code Online (Sandbox Code Playgroud)

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

flag = 1 ;
Run Code Online (Sandbox Code Playgroud)

并且线程监听更改,如下所示:

  void ()run{

       while(true){

            if(flag==1){
                   break;
              }

       sock1 = Ssocket.accept(); 
  }
Run Code Online (Sandbox Code Playgroud)

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

ass*_*ias 6

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

childTread.interrupt();
Run Code Online (Sandbox Code Playgroud)

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

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.
}
Run Code Online (Sandbox Code Playgroud)

请注意,这Ssocket.accept是不可中断的,所以如果你想阻止它等待,你必须从外面关闭它,强迫它抛出IOException.


ara*_*ran 3

Child thread

你应该在这里创建一个新函数,fe:

public void setFlag(int i)
  {
     flag = i;
  }
Run Code Online (Sandbox Code Playgroud)

Parent Thread

每当您想在子线程中终止/停止监听/...时,请调用:

 childThread.setFlag(1);
Run Code Online (Sandbox Code Playgroud)

如果您不需要子线程是匿名的,请创建一个ChildThread

 public ChildThread implements Runnable
{
    private int flag = 0;

    public ChildThread()
     {  }

    public void setFlag(int i)
      {
         flag = i;
      }
    public void run()
      { 
       //your code
      }
    ....
}
Run Code Online (Sandbox Code Playgroud)