java线程池的学习

java线程池的学习

参数介绍:
corePoolSize - 即使空闲时仍保留在池中的线程数,除非设置 allowCoreThreadTimeOut
maximumPoolSize - 池中允许的最大线程数
keepAliveTime - 当线程数大于核心时,这是多余的空闲线程在终止之前等待新任务的最大时间。
unit - keepAliveTime参数的时间单位
workQueue - 在执行任务之前用于保存任务的队列。 该队列将仅保存execute方法提交的Runnable任务

 /**
     *
     * @param corePoolSize 核心线程池的大小
     * @param maximumPoolSize 最大线程池的大小
     * @param keepAliveTime   线程池中超过corePoolSize数目的空闲线程最大存活时间;可以
     * allowCoreThreadTimeOut(true)使得核心线程有效时间
     * @param unit  时间单位
     * @param workQueue 用来暂时保存任务的工作队列
     * @param threadFactory 创建线程的工厂
     * @param handler  当提交任务数超过maximumPoolSize+workQueue之和时,任务会交给RejectedExecutionHandler来处理
     *当ThreadPoolExecutor已经关闭或ThreadPoolExecutor已经饱和
     * 时(达到了最大线程池大小且工作队列已满),execute()方法将要调用的Handler
     *                 
     * 1.当线程小于corePoolSize时,新提交任务将创建一个新线程执行任务,即使此时线程池中存在空闲线程。
     * 2.当线程达到corePoolSize时,新提交任务将被放入workQueue中,等待线程池中任务调度执行
     * 3.当workQueue已满,且maximumPoolSize>corePoolSize时,新提交任务会创建新线程执行任务
     * 4.当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理
     * 5.当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程
     * 6.当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭
     */
    public ThreadPoolExecutor(int corePoolSize,
        int maximumPoolSize,
        long keepAliveTime,
        TimeUnit unit,
        BlockingQueue<Runnable> workQueue,
        ThreadFactory threadFactory,
        RejectedExecutionHandler handler);
    }

2.ThreadPoolExecutor和Future的使用

public class ThreadPoolExecutorFutureTest {


    public static void main(String[] args) throws Exception {
        ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(3, 3, 60,
            TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(1000));
        //放入list提高返回的效率
        List<Future> futureList = new ArrayList<>();
        for(int i=0;i<=100;i++){
            Future<String> future = poolExecutor.submit(new Callable<String>() {
                @Override
                public String call() throws Exception {
                    Thread.sleep(2000);
                    return Thread.currentThread().getName();
                }
            });
            futureList.add(future);
        }
        Iterator<Future> iterator = futureList.iterator();
        while (iterator.hasNext())
            System.out.println(iterator.next().get());
        poolExecutor.shutdown();
    }

}

ThreadPoolExecutor中的keepAliveTime详解
https://blog.csdn.net/u010841296/article/details/89419115
ThreadPoolExecutor线程池的keepAliveTime
https://www.cnblogs.com/zxporz/p/10940251.html

java线程池及创建多少线程合适

IO 密集计算,如何将硬件利用率达到极致呢 我们将 R = IO 耗时 / Cpu耗时 我们从上面的例子来看,如果 IO 耗时 / Cpu 耗时 = 10 (我们平常可以用工具 apm 来统计这个比例),创建线程 A 执行 io 操作,我们希望 IO 操作的时候 Cpu 不能闲着,所以就应该创建 10 个线程去执行 Cpu 计算,当 Io 操作完毕后刚好 Cpu 也执行完毕,他们的利用率都是百分之 100 在执行这段代码的时候。这个例子我们要创建 1 + 10 = 11 个线程执行起来效率更高,于是我们就得到了公式: 1 + I/O耗时 / Cpu耗时,
如果是多核 Cpu 最佳线程数 = CPU 核数 * [ 1 +(I/O 耗时 / Cpu 耗时)
Cpu 密集型,这个就很简单了,Cpu 的核数 = 线程数就行,一般我们会设置 Cpu 核数 + 1,防止由于其他因素导致线程阻塞等

最佳线程数=CPU核数×[1+(I/O耗时/CPU耗时)]
线程数=CPU核数×目标CPU利用率×(1+平均等待时间/平均工作时间)

https://www.cnblogs.com/volare/p/12286822.html
https://blog.csdn.net/qq_40378034/article/details/100556161

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值