关于java:ExecutorService workStealingPool和cancel方法

ExecutorService workStealingPool and cancel method

您能想到为什么这个代码不能工作并且总是输出"finished"的任何原因吗?但是第二个示例工作时没有任何问题。我正在使用最新的JDK(8U45)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public static class MyClass implements Runnable {

        @Override
        public void run() {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ex) {
                System.out.println("Interrupted");
                return;
            }
            System.out.println("Finished");
        }

        public static void main(String[] args) {
             // spot the difference ->
             ExecutorService executorService = Executors.newWorkStealingPool(4);
             Future future = executorService.submit(new MyClass());
             Thread.sleep(100);
             future.cancel(true);
        }
    }

下面的例子完美无瑕:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static class MyClass implements Runnable {

        @Override
        public void run() {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException ex) {
                System.out.println("Interrupted");
                return;
            }
            System.out.println("Finished");
        }

        public static void main(String[] args) {
             ExecutorService executorService = Executors.newSingleThreadExecutor();
             Future future = executorService.submit(new MyClass());
             Thread.sleep(100);
             future.cancel(true);
        }
    }

编辑:增加了返回和更新的睡眠时间和另一个例子。


比我原来想象的简单。问题是窃取工作池在内部使用了ForkJoinPool,ForkJoinTask不支持Cancel(true),因此无法在任务启动后取消任务。

请参见参考资料文档(HTTP文件):

1
2
   mayInterruptIfRunning - this value has no effect in the default implementation
   because interrupts are not used to control cancellation.


没有办法强制终止Java中的线程。(二十年前,Java 1试图提供这一点,结果证明它是不可行的;试图去做的方法被拒绝了,没有替换。)

作为runnable的作者,您负责通过干净地终止自己的run方法来正确地响应中断。在您的例子中,您应该在catch块中退出您的run方法,但是您没有退出;您让方法的逻辑继续通过catch块。因此,即使线程被中断,也始终执行run方法的最后一条语句。