2017-07-18 65 views
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(); 
      } 
     } 
    } 
} 

回答

4

線程池中沒有線程正在拋出RejectedExecutionException。將任務提交給線程池的主線程實際上是拋出了RejectedExecutionException

主線程不會在提交時阻塞,因爲規範的規定它不應該。有機制可以做到這一點,請參閱 ThreadPoolExecutor Block When Queue Is Full?

+0

謝謝@約翰,我明白了。我也注意到,如果我只提交線程池中的兩個線程執行,主線程不會拋出RejectedExecutionException。但是這裏阻塞隊列的大小是一個,甚至最大池大小也是一個。 AFAIK如果隊列已滿,並且如果我們不能再添加任何線程,則可能拋出上述異常。那麼爲什麼主線程只會在第三個線程執行時拋出異常,而不是在第二次。 – Sunny

+1

當所有線程都處於活動狀態並且隊列已滿時,將會拋出一個'RJE'。您提交第一個任務,唯一的線程處於活動狀態,隊列現在爲空。您提交第二個任務,線程處於活動狀態並且隊列已滿。第三項任務會引發'RJE'。你可以在這裏閱讀我的答案,https://stackoverflow.com/questions/19003430/what-are-the-possible-reason-for-a-java-util-concurrent-rejectedexecutionexcepti/19006386#19006386。 –

+0

謝謝John.This很有用。 – Sunny