【怎么设置核心线程数也可以被回收?】

要设置核心线程数也可以被回收,可以使用以下两种方式:

使用ThreadPoolExecutor类中的allowCoreThreadTimeOut()方法。

这个方法默认是false,如果将其设置为true,就可以让核心线程数也可以被回收了。示例如下:

ThreadPoolExecutor executor = new ThreadPoolExecutor(
        corePoolSize,
        maximumPoolSize,
        keepAliveTime,
        TimeUnit.SECONDS,
        new LinkedBlockingQueue<>());
executor.allowCoreThreadTimeOut(true);

自定义ThreadPoolExecutor类,重写beforeExecute()方法和afterExecute()方法,在这两个方法中对核心线程进行回收。

示例如下:

public class CustomThreadPoolExecutor extends ThreadPoolExecutor {
    
    public CustomThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,
                                     BlockingQueue<Runnable> workQueue) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
    }

    @Override
    protected void beforeExecute(Thread t, Runnable r) {
        super.beforeExecute(t, r);
        if (this.getPoolSize() > this.getCorePoolSize()) {
            // 如果当前线程池中线程数大于核心线程数,那么就移除核心线程
            this.remove(t);
        }
    }

    @Override
    protected void afterExecute(Runnable r, Throwable t) {
        super.afterExecute(r, t);
        if (this.getPoolSize() == this.getCorePoolSize()) {
            // 如果当前线程池中线程数等于核心线程数,那么就继续执行核心线程
            this.prestartCoreThread();
        }
    }
}

使用自定义的ThreadPoolExecutor类示例如下:

CustomThreadPoolExecutor executor = new CustomThreadPoolExecutor(
        corePoolSize,
        maximumPoolSize,
        keepAliveTime,
        TimeUnit.SECONDS,
        new LinkedBlockingQueue<>());

使用以上两种方式,都可以让核心线程数也可以被回收。

你可能感兴趣的:(记录,Java,java,开发语言)