版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29726359/article/details/79343890
现在遇到一个情景,处理数据的代码运行在A线程里,在B线程里对A中的socket的accept进行close,结果每次都卡在accpet那里,无法close成功,因为在本线程中,socket可以正常关闭,但是如果在B线程来关闭A线程中的的socket,则会出现线程碰撞问题。
想了很久,找到一个可行的方法是,设置一个静态变量,用于充当锁,如果过关闭锁,socket在本线程关闭。在B线程中对开关进行开启控制。
- A线程:
if(Utils.openlock==true){
if(socket!=null)socket.close();
}
- B线程:
new Thread(new Runnable() {
public void run() {
System.out.println("进入开关按钮");
// openlock=true;
Utils.openlock=true;
//System.out.println(serverSocket.isClosed());
try {
serverSocket.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("1");
// if (serverSocket.isClosed()) {
// System.out.println("closed");
btnNewButton_4.setEnabled(true);
//}
}
}).start();
- 运行后,开关正常。如果更有更安全更简单的方法,可以相互学习。