钩子方法

任务太多,怎么拒绝

-- 拒绝时机

  • 当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("线程池被恢复了");
    }
}
我被执行
我被执行
线程池被暂停了
线程池被恢复了
我被执行
我被执行
我被执行

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注