日期:2014-05-20  浏览次数:20674 次

让线程中断的疑问
网上查了下,线程中断一般用interrupt() 方法,我现在的情况是线程T已经启动,T线程中调用了一个用户函数F,该函数可能会执行很长时间,但我要检测它如果该函数指定时间内未返回就要中断它,并且我的T线程中要能继续处理。

我发现用interrupt方法需要在T中调用sleep才会抛出InterruptedException,还有就是通过while (!isInterrupted)...{来判断,但是为什么是一个循环呢?我的程序只是一个函数,又不会重复的执行,怎么要用循环来判断??还有我的程序中也不一定会sleep啊,如何中断我的F呢?


------解决方案--------------------
java.util.concurrent中的
ExecutorService Future
对解决这个需求有所帮助,
不过since jdk1.5
------解决方案--------------------
简单起见,上代码吧
Java code

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) {
            }
        }
    }
}