2015-06-29 20 views
0

我想暂停执行新任务。 Official Documentation中提供的示例似乎也停止了当前执行的任务(尽管我很好奇它是如何在不中断线程的情况下执行的)。暂停执行使用ExectuorService的新线程

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(); 
    } 
    } 
} 
+0

新任务和当前任务有什么区别? –

+0

使用不同的执行器 – zubergu

+0

新任务是提交并且在队列中的任务。目前的任务是正在执行的任务(但尚未完成)。 –

回答

0

问题是不正确的。 PausablableThreadPoolExecutor不会停止当前执行的线程。对不正确的问题抱歉。

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

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