7

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

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

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

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

 flag=0;

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

flag = 1 ;

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

  void ()run{

       while(true){

            if(flag==1){
                   break;
              }

       sock1 = Ssocket.accept(); 
  }

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

4

4 回答 4

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.

于 2013-05-06T13:20:58.723 回答
3

Child thread

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

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
      }
    ....
}
于 2013-05-06T11:48:44.280 回答
0

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


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

   protected synchronized boolean cancelRequested ()
   {
       return stop;
   }
于 2013-05-06T11:57:16.693 回答
-1

Runnable使用您自己的实现进行扩展:

public class StoppableRunnable extends Runnable {

}

编写您的类以便您可以停止执行Runnable,您将在此处找到如何执行此操作的一个很好的示例How to proper stop the Thread in Java? . 请务必查看前两个答案

在您等效的terminate()功能中,进行所有清理

于 2013-05-06T11:48:58.410 回答