使用 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 不会停止当前执行的线程。为错误的问题道歉。
我想暂停执行新任务。 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 不会停止当前执行的线程。为错误的问题道歉。