钩子方法
最后更新于:2022-08-13 12:48:04
任务太多,怎么拒绝
-- 拒绝时机
- 当Executor关闭时,提交新任务会被拒绝
- 当Executor对最大线程和工作队列容量使用有限边界并且已经饱和时
四种拒绝策略
AborePolicy
直接抛出异常
DiscardPolicy
默默的把多余任务丢弃,不会通知任何方法
DiscardOldestPolicy
丢弃最老的任务
CallerRunsPolicy
会将任务返回给提交任务的线程去执行。避免了业务损失,可以让提交的速度降低。
钩子方法,给线程池加点料
给线程池增加暂停恢复功能
public class PauseThreadPool extends ThreadPoolExecutor {
private boolean isPause;
private ReentrantLock lock = new ReentrantLock();
private Condition unPaused = lock.newCondition();
@Override
protected void beforeExecute(Thread t, Runnable r) {
super.beforeExecute(t, r);
lock.lock();
try {
while (isPause) {
unPaused.await();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
private void pause() {
lock.lock();
try {
isPause = true;
} finally {
lock.unlock();
}
}
public void resume() {
lock.lock();
try {
isPause = false;
unPaused.signalAll();
} finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
PauseThreadPool pauseThreadPool = new PauseThreadPool(1, 1, 10l, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("我被执行");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
for (int i = 0; i < 5; i++) {
pauseThreadPool.execute(runnable);
}
Thread.sleep(1500);
pauseThreadPool.pause();
System.out.println("线程池被暂停了");
Thread.sleep(1500);
pauseThreadPool.resume();
System.out.println("线程池被恢复了");
}
}
我被执行
我被执行
线程池被暂停了
线程池被恢复了
我被执行
我被执行
我被执行