我想暂停新任务的执行。 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();
}
}
}
答案 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不会停止当前执行的线程。为不正确的问题道歉。