【问题标题】:How to cancel incomplete task on ExecutorService [duplicate]如何取消 ExecutorService 上的未完成任务 [重复]
【发布时间】:2017-07-06 15:11:18
【问题描述】:

我已经向 ExecutorService 提交了两个任务,task1task2。 Task2 需要 5 秒完成,task1 需要 10 秒。

当 task2 完成并继续其余逻辑时,如何停止提交的任务(即:task1)?

到目前为止,这是我的代码:

public class mt_poc {
    public static void action_1 () throws InterruptedException {
        System.out.println("action_1 invoke " );
        Thread.sleep(10000);
        action_2 ();
        System.out.println("action_1 done" );
    }

    public static void action_2() throws InterruptedException {
        System.out.println("action_2 invoke " );
        Thread.sleep(5000);
        System.out.println("action_2 done " );
    }

    public static void main(String[] args) {                    
        System.out.println("TEST");         
        Runnable task1 = new Runnable() {
            public void run() {
                try {
                    action_1 ();
                }
                catch(InterruptedException e) {
                    System.out.println("action_1 invoke interrupted");
                }
                System.out.println("action_1 invoke run is over" );
                }
            }; 

        Runnable task2 = new Runnable() {
            public void run() {
                try {
                    action_2 ();
                }
                catch(InterruptedException e) {
                   System.out.println("action_2 invoke interrupted");
                }
                System.out.println("action_2 invoke run is over" );
                }
            };          

        ExecutorService executor = Executors.newFixedThreadPool(2);

        try {
            executor.submit(task1);
            executor.submit(task2);
            // cancel uncomplete task 
            executor.shutdown();
            executor.awaitTermination(5, TimeUnit.SECONDS);
            // continues the rest of logic
        } catch (InterruptedException e) {
                e.printStackTrace();
        }

        System.out.println("Shutdown executor");
    }
}

【问题讨论】:

    标签: java multithreading concurrency executorservice


    【解决方案1】:

    你可以使用shutdownNow()方法

    尝试停止所有正在执行的任务,停止处理 等待任务,并返回正在等待的任务列表 执行。

    完整文档:

    https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html

    shutdown() 方法会等待所有线程完成后再关闭执行器

    【讨论】:

      【解决方案2】:

      您必须从 submit 函数中检索 Future 对象。
      这些用于控制正在运行的线程并获取它的状态。 如果您有期货,请致电Future2.get()。这将阻塞线程,直到 Task2 完成。不,您可以使用Future1.cancel(true) 中止另一个线程。

      但无法暂停和恢复。见Java ExecutorService pause/resume a specific thread

      如果你想要这样的特定行为,你需要使用线程。

      但是为什么要在单独的线程中执行此操作,因为使用单个线程会更简单有效。

      【讨论】:

        猜你喜欢
        • 2011-03-17
        • 2021-08-14
        • 2012-06-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-06
        相关资源
        最近更新 更多