网上查了下,线程中断一般用interrupt() 方法,我现在的情况是线程T已经启动,T线程中调用了一个用户函数F,该函数可能会执行很长时间,但我要检测它如果该函数指定时间内未返回就要中断它,并且我的T线程中要能继续处理。我发现用interrupt方法需要在T中调用sleep才会抛出InterruptedException,还有就是通过while (!isInterrupted)...{来判断,但是为什么是一个循环呢?我的程序只是一个函数,又不会重复的执行,怎么要用循环来判断??还有我的程序中也不一定会sleep啊,如何中断我的F呢?

解决方案 »

  1.   

    java.util.concurrent中的
    ExecutorService Future
    对解决这个需求有所帮助,
    不过since jdk1.5
      

  2.   

    当时间过长时就中断你的线程,然后再重新启动你的线程??中断后线程还是在运行的,但不知道如何重新启动线程?重新启动是再调用一次start???还是继续上次中断后的运行?Future的办法不适合我的应用。因为我是一个网络服务器,由主线程接受连接,子线程去接收数据。
      

  3.   

    Java的线程都有一个interrupt标志,线程在运行时,如果别的线程想中断这个线程的运行(通过调用Thread.interrupt),会出现几种情况:当线程处于可以打断的阻塞状态,比如Thread.sleep()和Object.wait(),这时就会触发InterruptedException这个异常了,调用者必须处理一下这个异常,通常就是清理工作喽,或者继续往上抛,由调用者去决定后续的动作。 
    当线程处于其它状态,比如努力干活,或虽然阻塞但不能被中断(比如一些IO操作),这时线程的中断状态位会被置位,剩下的事情就依赖线程自己的处理了,也就是说线程需要自己抽空来看这个标志位,如果不看的话,别人就没法打断你的运行了。 
    这就我的线程调用的是用户函数,该用户函数不知道会怎样,更不会去查看这个标志,所以应该怎么处理这种情况呢?
      

  4.   

    用 Stop() 可以强制结束线程。
    不过这个API已经不推荐使用了,强制杀死线程可能导致同步问题,因为机制不一样,有些资源不会被释放。现在用interrupt() API的目的是保证线程的资源是以java的方式处理的,而不是被native代码处理
      

  5.   

    简单起见,上代码吧package test;public class TestThread { /**
     * @param args
     */
    public static void main(String[] args) {
    test a = new test();
    p(a);
    p(a);
    a.start();
    p(a);
    p(a);
    p(a);
    // a.stop();       <=== 这里是尝试用各种方法终端线程的地方   
    // a.interrupt();
    p(a);
    p(a);
    p(a);
    p(a);
    p(a);
    p(a);
    p(a);
    p(a);
    p(a);
    p(a);
    p(a);
    p(a);
    p(a); } static long ts = System.currentTimeMillis(); private static void p(test a) {
    System.out.println(System.currentTimeMillis() - ts
    + ": Thread.isAlive=" + a.isAlive());
    try {
    Thread.sleep(300);
    } catch (InterruptedException e) {
    }
    } static class test extends Thread {
    public void run() {
    System.out.println("I'm running");
    sleepAnyWay(1000);
    System.out.println("I'm running again");
    sleepAnyWay(1000);
    System.out.println("I'm gonna to quit");
    sleepAnyWay(1000);
    }                // 这个函数模拟线程中的用户函数把 interrupt异常吃掉的情况
    void sleepAnyWay(long ts) {
    try {
    Thread.sleep(ts);
    } catch (InterruptedException e) {
    }
    }
    }
    }不尝试结束线程,直接执行的结果如下:0: Thread.isAlive=false
    313: Thread.isAlive=false
    610: Thread.isAlive=true
    I'm running
    907: Thread.isAlive=true
    1219: Thread.isAlive=true
    1516: Thread.isAlive=true
    I'm running again
    1813: Thread.isAlive=true
    2110: Thread.isAlive=true
    2422: Thread.isAlive=true
    I'm gonna to quit
    2719: Thread.isAlive=true
    3016: Thread.isAlive=true
    3313: Thread.isAlive=true        《======= 线程运行结束后退出
    3626: Thread.isAlive=false
    3922: Thread.isAlive=false
    4219: Thread.isAlive=false
    4516: Thread.isAlive=false
    4829: Thread.isAlive=false
    5126: Thread.isAlive=false
    用 a.interrupt(); 尝试结束线程的运行结果如下:
    16: Thread.isAlive=false
    313: Thread.isAlive=false
    610: Thread.isAlive=true
    I'm running
    907: Thread.isAlive=true
    1219: Thread.isAlive=true
    1516: Thread.isAlive=true
    I'm running again
    1813: Thread.isAlive=true
    2110: Thread.isAlive=true
    2422: Thread.isAlive=true
    I'm gonna to quit
    2719: Thread.isAlive=true
    3016: Thread.isAlive=true
    3313: Thread.isAlive=true
    3625: Thread.isAlive=false   《===== 因为异常被用户函数吃掉,所以interrupt无法结束线程,还是直到
                                         运行结束后退出
    3922: Thread.isAlive=false
    4219: Thread.isAlive=false
    4516: Thread.isAlive=false
    4829: Thread.isAlive=false
    5126: Thread.isAlive=false
    用 stop 结束线程的结果如下:0: Thread.isAlive=false
    297: Thread.isAlive=false
    594: Thread.isAlive=true
    I'm running
    906: Thread.isAlive=true
    1203: Thread.isAlive=true
    1500: Thread.isAlive=true
    1797: Thread.isAlive=false      <=== p(a)调用3此后,调用stop, 线程确实结束了,虽然异常还是会被用
                                         户函数吃掉
    2109: Thread.isAlive=false
    2406: Thread.isAlive=false
    2703: Thread.isAlive=false
    3000: Thread.isAlive=false
    3312: Thread.isAlive=false
    3609: Thread.isAlive=false
    3906: Thread.isAlive=false
    4203: Thread.isAlive=false
    4516: Thread.isAlive=false
    4813: Thread.isAlive=false
    5109: Thread.isAlive=false