java:如何停止等待很长时间的线程
我有一个程序通过xot(tcp/ip上的x25)协议连接到服务器 我有一个线程连接,使用xot库向服务器发送recv数据java:如何停止等待很长时间的线程,java,multithreading,Java,Multithreading,我有一个程序通过xot(tcp/ip上的x25)协议连接到服务器 我有一个线程连接,使用xot库向服务器发送recv数据 public class MyThread extends Thread{ public MyThread() { } @Override public void run(){ // init sock ... // connect to server sock.connec
public class MyThread extends Thread{
public MyThread() {
}
@Override
public void run(){
// init sock
...
// connect to server
sock.connect("server_address", timeout);
System.out.println("send data ..");
sock.send(data);
System.out.println("send data ok, recv data ..");
Data data = sock.recv();
System.out.println("recv data ok");
}
}
我使用的lib可以处理连接超时,但在发送和接收数据时,没有像setSoTimeout()这样的方法来处理超时
所以,当send&recv方法长时间运行时,我不知道如何正确地停止mythread
任何人都可以给我建议一些解决办法
谢谢
泉
请注意,
interrupt()
并非完全是傻瓜式的(请阅读文档),但它很可能对您的情况有所帮助。您可能还需要修改自己的代码(在MyThread
中),以使用interrupted
或isInterrupted
检查中断状态,我没有发现您正在阻止/等待的发送/接收是否为“正常”TCP/IP套接字;但如果是这样,只需关闭套接字,就可以很容易地从外部中止I/O操作。这并不广为人知,但完全合法,而且很有魅力
当然,I/O操作会产生一个
IOException
,但这很容易捕获,然后您可以退出线程的run()
方法。您需要使用一个volatile标志和一个while循环,该循环将倒计时,直到超时耗尽或连接发生。请注意,您需要第二个线程(或计时器)当线程无法自行中断时触发中断。哦,当mythread suspend at recv方法等待服务器响应时,如何添加代码来检查中断状态(不打印“recv data ok”),我认为interrupt()不适用于他的自定义套接字库,除非它是由nio实现的。若并没有,recv已经阻塞,并且并没有办法定期检查中断状态。如何在我的线程挂起recv方法时添加while循环来等待来自服务器的数据?
MyThread myt = new MyThread();
myt.start();
... later on ...
myt.interrupt();