gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 03:21:02 24 4
gpt4 key购买 nike

我有两个类。一个 POJO 和 main。

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 block 后仍继续运行。

最佳答案

让我们转向 awaitTermination 的 javadoc

阻塞,直到所有任务在关闭请求后完成执行,或者发生超时,或者当前线程被中断,以先发生者为准。

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

您的 main 将遇到超时,但仅仅因为您随后打印“所有任务已完成”并不意味着这是一个真实的声明。那些提交的任务完成了,好了,就完成了。而且不是之前!

所以,如果你想真正“停止”一切,你应该尝试 shutdownNow相反。

关于java - ExecutorService.awaitTermination(timeout,unit) 即使超时后仍继续运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39609845/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com