我有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区块之后仍然继续运行。
答案 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方法中运行此代码。