2010-01-06 58 views
1

我有一个程序通过xot(x25 over tcp/ip)协议连接到服务器。java:如何停止等待很长时间的线程

我有一个线程连接,发送recv数据与服务器使用xot库。

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()方法没有发送& recv的数据时,处理超时。

因此,当发送& recv方法运行很长时间时,我不知道如何阻止mythread正确的方向。

任何人都可以建议我一些解决方案。

感谢

回答

1
MyThread myt = new MyThread(); 
myt.start(); 
... later on ... 
myt.interrupt(); 

注意interrupt()没有完全防呆(阅读文档),不过赔率是好的,它会在你的情况有所帮助。您可能还需要修改自己的代码(内MyThread)使用interruptedisInterrupted

+0

请注意,由于线程无法自行中断,因此您需要第二个线程(或定时器)来触发中断。 – Thilo 2010-01-06 09:53:50

+0

好的,谢谢所有:) – QuanNH 2010-01-06 10:14:26

+0

哦,如何添加代码,以检查中断状态,当recath方法等待resp从服务器(没有打印“recv数据ok”)mythread挂起 – QuanNH 2010-01-06 10:37:39

1

我没赶上发送/接收是否你拦截检查中断状态/等待是一个“正常的” TCP/IP插座;但如果是这样的话,只需关闭套接字就可以轻松地从外部中止I/O操作。这不是广为人知,但是AFAIK是完全合法的,它的功能就像一个魅力。

I/O操作当然会产生一个IOException,但这很容易捕捉,然后您可以退出线程的run()方法。

+0

我会尽力,谢谢 – QuanNH 2010-01-06 10:15:07

0

您将需要使用一个易失性标志和一个while循环,直到超时或耗尽连接才会倒计时。

+0

如何添加一个while循环,同时我的线程暂停在recv方法从服务器等待数据? – QuanNH 2010-01-06 10:39:13