使用 ExectuorService 暂停新线程的执行

Pause new threads from executing using ExectuorService

我想暂停执行新任务。 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();
     }
   }
 }

包装 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();
}

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

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