ExecutorService.awaitTermination(timeout,unit)即使在超时后仍继续运行

时间:2016-09-21 07:18:04

标签: java

我有2节课。 POJO和主要。

POJO班

public class Processor implements Runnable{

private int id;

public Processor(int id)
{
    this.id = id;

}
@Override
public void run() {
    System.out.println("Started ...."+ id);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println("Stoped ..." + id);
}

}

主要班级

 public class Main {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    ExecutorService executor = Executors.newFixedThreadPool(2);
    for(int i = 0; i < 5;i++)
    {
        executor.submit(new Processor(i));


    }
    executor.shutdown();
    System.out.println("All tasks Submits");
    try {
        executor.awaitTermination(1, TimeUnit.MILLISECONDS);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        System.out.println("Intrupted or Timeout");

    }
    System.out.println("all Tasks completed");
}

}

当我运行此代码时,我得到了

的输出
Started ....0
All tasks Submits
Started ....1
all Tasks completed
Stoped ...1
Started ....2
Stoped ...0
Started ....3
Stoped ...2
Started ....4  
Stoped ...3
Stoped ...4

但是根据我的理解,一旦发生超时,它应该触发中断的异常并返回。但是为什么它在退出TRY区块之后仍然继续运行。

2 个答案:

答案 0 :(得分:1)

让我们转向awaitTermination

的javadoc

阻止所有任务在关机请求或超时发生后执行完毕,或者当前线程中断,以先发生者为准。

换句话说:调用该方法并不意味着已经提交的作业不再被执行。所以缺陷在你的假设范围内。

你的主要会遇到那个超时,但只是因为你打印了#34;所有任务都已完成&#34;没有做出真实的陈述。完成后,这些提交的任务就完成了。而不是之前!

所以,如果你想真的&#34;停止&#34;一切,您应该尝试使用shutdownNow

答案 1 :(得分:1)

正如@GhostCat所说,awaitTermination在给定时间内被线程阻塞,如果你想在阻塞时引发异常,你可以这样做:

Thread t = new Thread(){
    public void run() {
    ExecutorService exec = Executors.newCachedThreadPool();
    exec.execute(new Runnable() {
        @Override
        public void run() {
        System.out.println("start ...");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }
        System.out.println("end ...");
        }
    });

    exec.shutdown();

    try {
        exec.awaitTermination(100, TimeUnit.MILLISECONDS);
    } catch (Exception e) {
        System.out.println("awaitTermination");
    }
    System.out.println("main ended");
    };
};
t.start();
Thread.sleep(10);;
t.interrupt();

在main方法中运行此代码。