最近碰到一个问题:如果 Thread 被阻塞到 IO 操作上时,主线程(即创建这个线程的线程)无法关闭此线程。
    不知道各位大虾有没有解决方法。可是让主线程关闭子线程的...    谢谢大家...

解决方案 »

  1.   

    我是说如何关闭线程。
    普通的关闭可以如下:public void run()
    {
    while(true)
    {
    //do something
    try
    {
    sleep(1000);
    }
    catch(InterruptException ex)
    {
    break; // 当父线程调用该线程的interrupt方法时,抛出异常后,break
    }
    }}如果在 do something 的时候被 IO 操作阻塞,则父线程使用 interrupt 方法时,没有任何效果。即不能正常关闭线程执行。我想看看大家有什么办法,可以使得父线程可以在任意时刻将子线程关闭。
      

  2.   

    如果在 do something 的时候被 IO 操作阻塞这时候肯定没有安全的方法关闭线程,你就用Thread.stop()吧.
      

  3.   

    我也碰到了这个问题,不知道如何解决,我用的在线程里监听一个socket端口,但不知道如何把这个线程关闭,不能用stop的,如果用stop的话,会抛出一个error,而且是catch捕获不到的,正不知道如何解决,关注ing
      

  4.   

    stop是不推荐的 ,而且用stop的时候好象所有的阻塞线程都被唤醒。java对线程的操作太弱了,interrupt方法根本不管用 ,好象只能通过制造exception的方式中断。先调用interrupt方法,然后再调用sleep 或者顺序倒过来。这样可以产生exception,就可以终止这个线程了。
      

  5.   

    楼上:java对线程的操作太弱了???
    不见得吧?
      

  6.   

    给你个例子:
    import java.util.*;class CanStop extends Thread{
    private volatile boolean stop = false;
    private int counter =0;
    public void run(){
    while(!stop && counter <10000){
    System.out.println(counter++);
    }
    if(stop){
    System.out.println("Deteced stop");
    }
    }
    public void requestStop(){stop =true;}
    }public class Stopping{
    public static void main(String[] args){
    final CanStop stoppable = new CanStop();
    stoppable.start();
    new Timer(true).schedule(new TimerTask(){
    public void run(){
    System.out.println("Requesting stop");
    stoppable.requestStop();
    }
    },510);
    }
    }
      

  7.   

    interhanchi(闭关修练中!) 所说的方法,我知道你什么意思,其实还是应该改一下,判断应该在循环里面,可是在这种情况下是不行的。因为在每一个循环里面,正在等着一个IO操作,操作未完成的情况下,是挂起的。根本出不来。
      

  8.   

    把此线程设置为 setDaemon(true);,这样主线程结束时它就结束了
      

  9.   

    把 socket 端口关闭,就会退出阻塞状态。剩下的事情就好办了。
    线程陷入阻塞的i/o操作中,一般是没有办法响应外部的操作的(至少我是不知道),stop之类的形同虚设。后来找遍jdoc。关于socket类中有一点点小小的说明。说处于listen ,Accept等函数中时关闭
    socket就会有一个关于socket的异常抛出。才算抓到一根救命稻草。
      

  10.   

    哦,弄错了 ,楼主说的不是socket的。 是rumlee(rum-lee) 说的。
    说句不负责的话(没有经过测试),道理应该是一样的吧。在没有提供给外部通讯(比如中断,消息等)的情况下。破坏阻塞操作针对的对象,让阻塞操作异常。从而跳出阻塞。应该是可行的。
      

  11.   

    to sjjf(水晶剑锋)说的有道理,想想也是,可以通过破坏被阻塞的对象,使得IO操作发生异常,从而结束线程,我可以试一试不过不知道还有没有什么更好的方法,因为使用异常来控制逻辑,总是显得不是那么的好吧,呵呵
      

  12.   

    有,通过使用异步io.
    java的网络的异步io好像是 Selector
    不过我没有用过,我们的模型不是这样子的,如果改成那样子的话开发成本太高。
    如果需要可以,偶可以帮你看看文档。
      

  13.   

    class AA extends Thread
    {
    public void run()
    {
    System.out.println("Starting loop");
    while(true){
    if(this.interrupted())
    break;
    }
    System.out.println("End loop");
    }
    }
    public class TestClass
    {
    public static void main(String args[]) throws Exception
    {
    AA a = new AA();
    a.start();
    Thread.sleep(2000);
    a.interrupt();
    }
    }