我有一个主线程,在该线程中我开始一个新线程。 (子线程)。该子线程打开服务器套接字并开始侦听连接。 我希望该线程停止执行并关闭它初始化的任何内容(如Socket),当主线程从外部获取消息时(从那里得到消息不是关注点)。我应该如何停止线程并关闭所有连接是我想要的。
我应该使用共享变量吗?这样当主线程收到消息时它应该修改它,子线程应该不断检查该共享变量的变化吗?
我该如何实施?一些有用的链接可能有帮助或示例代码?
我尝试的内容如下: 我在主线程中声明了一个变量
flag=0;
当主线程收到消息时,它会设置
flag = 1 ;
并且线程按如下方式侦听更改:
void ()run{
while(true){
if(flag==1){
break;
}
sock1 = Ssocket.accept();
}
但上面的代码根本不起作用。我该怎么办?
答案 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()
功能的情况下,执行所有清理工作