2013-02-03 29 views
2
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.TimeUnit; 

public class Main 
{ 
    public static void main(String[] args) 
    { 
     final ExecutorService executor = Executors.newFixedThreadPool(10); 
     executor.execute(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       for (int i = 0; i < 10; i++) 
        executor.execute(new Runnable() 
        { 
         @Override 
         public void run() 
         { 
          System.out.println("run"); 
         } 
        }); 
      } 
     }); 
     executor.shutdown(); 
     try 
     { 
      executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); 
     } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

我得到RejectedExecutionException,因爲內部executor.executeshutdown之後調用。在這種情況下我該如何等待執行者?ExecutorService.shutdown。當任務隊列變空時,我怎樣才能關閉執行程序?

回答

2

你必須知道什麼時候不會有更多的任務。這不是它可以爲你猜測的東西。將關機移至第一個任務,它將按照您的預期行事。即只有當你知道你不會添加更多任務時纔會關閉。

另一種方法是使用

final ExecutorService executor = new ThreadPoolExecutor(0, 10, 1, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>()); 

這不會關閉執行,但將停止所有的線程,則可以放棄執行,當你不需要它了。注意:如果您稍後添加更多任務,它將根據需要啓動線程。

final ThreadPoolExecutor executor = new ThreadPoolExecutor(10, 10, 100, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); 
for (int i = 0; i < 1000; i++) 
    executor.submit(new Callable<Void>() { 
     @Override 
     public Void call() throws Exception { 
      Thread.sleep(2); 
      return null; 
     } 
    }); 
while (executor.getQueue().size() > 0) { 
    System.out.println("Queue " + executor.getQueue().size() + ", Pool size " + executor.getPoolSize()); 
    Thread.sleep(200); 
} 
executor.setCorePoolSize(0); 
while (executor.getPoolSize() > 0) { 
    System.out.println("Pool size " + executor.getPoolSize()); 
    Thread.sleep(200); 
} 
System.out.println("Pool size " + executor.getPoolSize()); 

打印

Queue 946, Pool size 10 
Queue 32, Pool size 10 
Pool size 10 
Pool size 0 

,然後退出。注意:如果有任何線程仍在運行,程序將不會退出。例如

+0

我發表了這段代碼。在我的程序中,有兩級以上的通話,我無法知道任務何時結束。在第一次「執行」之後,隊列中有1個任務,我想知道隊列何時變空。 – eXXXXXXXXXXX2

+0

如果您不知道何時不想添加更多任務,則無人執行;)如果知道可能添加任務的任務數量,並且存在最後一個任務時可以調用關閉,則可以使用計數器。例如以'ai = new AtomicInteger(50);'開頭或者是大小和使用'if(ai.decrementAndGet()== 0)executor.shutdown();' –

+0

我認爲Java中有一些工具可以使用它。顯然,我需要像您的定製解決方案。謝謝你) – eXXXXXXXXXXX2

相關問題