线程池队列问题

private ExecutorService single = new ThreadPoolExecutor(1, 1, 2, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1/*2会有3个任务,1个在运行,2个在等待*/), new ThreadFactory() {
        @Override
        public Thread newThread(@NonNull Runnable r) {
            return new Thread(r, "download-bg" + new Random(1).nextInt() + "");
        }
    }, new ThreadPoolExecutor.DiscardOldestPolicy());
    ```
    
当single.execute(Runnable) 执行时,如果有多个任务,只会同时执行一个任务,另一个在队列里;如果队列里有一个任务,再多次调用single.execute(Runnable),只会把最后一次的调用放入队列

关于拒绝策略

拒绝策略介绍
线程池的拒绝策略,是指当任务添加到线程池中被拒绝,而采取的处理措施。
当任务添加到线程池中之所以被拒绝,可能是由于:第一,线程池异常关闭。第二,任务数量超过线程池的最大限制。

线程池共包括4种拒绝策略,它们分别是:AbortPolicy, CallerRunsPolicy, DiscardOldestPolicy和DiscardPolicy。

AbortPolicy         -- 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。
CallerRunsPolicy    -- 当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread线程池中处理被拒绝的任务。
DiscardOldestPolicy -- 当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。
DiscardPolicy       -- 当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。
https://www.cnblogs.com/skywang12345/p/3512947.html

你可能感兴趣的:(Android)