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)
但上面的代码根本不起作用.我该怎么办?
中断线程的正确方法是通过中断机制.在主线程中,当您想要停止子线程时,请调用:
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
.
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)
归档时间: |
|
查看次数: |
5867 次 |
最近记录: |