1
爲什麼主線程不停止當線程池中的一個線程拋出RejectedExecutionException?我在這裏做錯了什麼?線程池中的第三個線程正在拋出RejectedExecutionException,並且我沒有在主線程中處理這個異常。所以我必須處理這個異常,以使我的主線程停止。任何幫助,將不勝感激。RejectedExecutionException後調用線程不停止
public static void main(String[] args) {
ExecutorService threadPool = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(1));
threadPool.execute(new TestOne());
threadPool.execute(new TestTwo());
threadPool.execute(new TestThree());
threadPool.shutdown();
try {
threadPool.awaitTermination(2L, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("main thread stopped");
}
}
class TestOne implements Runnable {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Executing task one");
try {
Thread.sleep(10);
} catch (Throwable e) {
e.printStackTrace();
}
}
}
}
class TestTwo implements Runnable {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Executing task two");
try {
Thread.sleep(10);
} catch (Throwable e) {
e.printStackTrace();
}
}
}
}
class TestThree implements Runnable {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("Executing task three");
try {
Thread.sleep(10);
} catch (Throwable e) {
e.printStackTrace();
}
}
}
}
謝謝@約翰,我明白了。我也注意到,如果我只提交線程池中的兩個線程執行,主線程不會拋出RejectedExecutionException。但是這裏阻塞隊列的大小是一個,甚至最大池大小也是一個。 AFAIK如果隊列已滿,並且如果我們不能再添加任何線程,則可能拋出上述異常。那麼爲什麼主線程只會在第三個線程執行時拋出異常,而不是在第二次。 – Sunny
當所有線程都處於活動狀態並且隊列已滿時,將會拋出一個'RJE'。您提交第一個任務,唯一的線程處於活動狀態,隊列現在爲空。您提交第二個任務,線程處於活動狀態並且隊列已滿。第三項任務會引發'RJE'。你可以在這裏閱讀我的答案,https://stackoverflow.com/questions/19003430/what-are-the-possible-reason-for-a-java-util-concurrent-rejectedexecutionexcepti/19006386#19006386。 –
謝謝John.This很有用。 – Sunny