2013-02-03 28 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

相关问题