当前位置: 首页 > 知识库问答 >
问题:

ExecutorService workStealingPool和cancel方法

邢冷勋
2023-03-14

你能想一想为什么这段代码不起作用并且总是输出“finished”,但是第二个示例却没有任何问题地工作。我正在使用最新的JDK(8U45)。

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

下面的示例完美无缺:

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

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

共有2个答案

养翔
2023-03-14

没有办法在Java强行终止一个线程。(20年前,Java 1.0试图提供这一点,但结果是行不通的;试图做到这一点的方法被否决了,没有任何替代方法。)

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

邓深
2023-03-14

比我原先想象的要简单。问题是Work-Steeting-Pool在内部使用ForkJoinPool,而ForkJoinTask不支持cancel(true),因此在任务启动后不可能取消任务。

请参阅javadoc文档(http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/forkjointask.html):

   mayInterruptIfRunning - this value has no effect in the default implementation 
   because interrupts are not used to control cancellation.
 类似资料:
  • Cancels asynchronous iteration.

  • 本文向大家介绍Java Timer cancel()方法与示例,包括了Java Timer cancel()方法与示例的使用技巧和注意事项,需要的朋友参考一下 计时器类方法 cancel()方法在java.util包中可用。 cancel()方法用于取消此Timer并丢弃当前计划的任何任务。 cancel()方法是一个非静态方法,只能通过类对象访问,如果尝试使用类名访问该方法,则会收到错误消息。

  • 我有一个向txt文件添加条目的add按钮,还有一个由txt文件填充的jlist。当添加条目时,jlist会立即刷新。add按钮利用showinputdialog让用户添加一个条目,这里出现了问题: 1)我知道当按下取消按钮时,joptionpane返回NULL。我如何使它在按下取消时不会在txt文件和jlist中添加“NULL”?

  • 问题内容: 我是Android开发的新手,正在尝试制作小游戏。 对我不起作用。 任何想法? 感谢您的回答! 问题答案: 我必须在这里做一个假设,因为代码显示不多!显然,您正在将内部对象用作内部类,这样无论何时都将触发计时器,并且它将创建对象!我想最好创建一个的全局实例。 并以这种方式编写代码:

  • 问题内容: 我有一个ProgressMonitor 和一个SwingWorker 。我想取消的SwingWorker当我按上-按钮。我想这不应该太难,并且我阅读了一些有关SwingWorker和ProgressMonitor的教程,但是我无法使其正常工作。 进度更新工作正常,但永远不会。我想我需要为ProgressMonitor提供一个propertyChangeListener,但是我不知道如何

  • 最近,我使用了ThreadPoolExecutor和priorityqueue,并在将来遇到了这两种方法。对未来任务执行cancel()。和任务。remove(),将其从队列中移除。 更好的选择是什么?有什么区别吗?我可以保存两者的列表(从submit()接收的未来对象或任务本身),不确定要使用什么。。。 移除: 取消: 我使用了以下方法:http://docs.oracle.com/javase