使用ExectuorService暂停执行新线程

时间:2015-06-29 13:19:31

标签: java multithreading executorservice

我想暂停新任务的执行。 Official Documentation中提供的示例似乎也在停止当前执行的任务(尽管我想知道如何在不中断线程的情况下执行此操作)。

class PausableThreadPoolExecutor extends ThreadPoolExecutor {
   private boolean isPaused;
   private ReentrantLock pauseLock = new ReentrantLock();
   private Condition unpaused = pauseLock.newCondition();

   public PausableThreadPoolExecutor(...) { super(...); }

   protected void beforeExecute(Thread t, Runnable r) {
     super.beforeExecute(t, r);
     pauseLock.lock();
     try {
       while (isPaused) unpaused.await();
     } catch (InterruptedException ie) {
       t.interrupt();
     } finally {
       pauseLock.unlock();
     }
   }

   public void pause() {
     pauseLock.lock();
     try {
       isPaused = true;
     } finally {
       pauseLock.unlock();
     }
   }

   public void resume() {
     pauseLock.lock();
     try {
       isPaused = false;
       unpaused.signalAll();
     } finally {
       pauseLock.unlock();
     }
   }
 }

2 个答案:

答案 0 :(得分:0)

包装Runnable接口可能更容易,因此您不必自己制作ThreadPool。

public abstract class PausableRunnable implements Runnable{
     private final object _monitor;
     public PausableRunnable(object monitor){
         _monitor = monitor;
     }
     @Override
     public void Run(){
         WaitForNotify();
     }

     public void WaitForNotify(){
         synchronized(_monitor){
             while(!done){
                 _monitor.wait();
             }
         }
         doWork();
     }
     public abstract void doWork();
}

这可以轻松地暂停新线程。暂停正在运行的线程是一项不同的任务,我认为这就是你的意思。我的解决方案的最大问题是,如果你已经想要继承某些东西,但这是一个起点

答案 1 :(得分:0)

问题不正确。 PausablableThreadPoolExecutor不会停止当前执行的线程。为不正确的问题道歉。