java的线程池 您所在的位置:网站首页 9900k关闭超线程方法 java的线程池

java的线程池

2023-06-18 10:53| 来源: 网络整理| 查看: 265

一、线程池概念 若不使用线程池,在新创建的线程start()后执行完run()就自动销毁了,造成了资源的浪费。使用线程池可以暂时存储线程。 线程池的主要核心原理: 在这里插入图片描述 线程池的代码实现: 在这里插入图片描述 注意:在实际开发中线程池并不会关闭,例如服务器要24小时接收用户的访问请求。 在这里插入图片描述 例如,定义实现Runnable接口的类设置任务: 在这里插入图片描述 使用线程池: 在这里插入图片描述 可以看到不同线程执行不同MyRunnable对象的任务。 而改写代码,增长线程的逐次提交的时间,会发现同一个线程连续执行不同MyRunnable对象的任务: 在这里插入图片描述 在这里插入图片描述 二、使用ThreadPoolExecutor自定义线程池(方便修改) ThreadPoolExecutor线程池的几个核心元素: 核心线程数量,线程池中最大线程数量、空闲时间(值)、空闲时间(单位)、阻塞队列、创建线程的方式、要执行的任务过多时的解决方案。 例如,自定义一个线程池,核心线程有3个,临时线程有3个,阻塞队列长度为3。当有5个任务提交时,线程池现创建3个线程执行前3个任务,后2个任务在阻塞队列中排队等待;当有8个任务提交时,线程池现创建3个线程执行前3个任务,第4,5,6个任务阻塞队列中排队等待,线程池再创建2个临时线程取处理任务7和任务8。所有,只有当核心线程都在工作,阻塞队列被占满时才会创建临时线程。当有10个任务提交时,线程池现创建3个线程执行前3个任务,第4,5,6个任务阻塞队列中排队等待,线程池再创建3个临时线程取处理任务7、8、9,任务10会触发任务拒绝策略。java中有四个任务的拒绝策略,知道第一种即可。 在这里插入图片描述

ThreadPoolExecutor pool = new ThreadPoolExecutor( 3,//核心线程数量,能小于0 6,//最大线程数量,不能小于0,大于等于核心线程数量 60,//空闲线程最大存活时间 TimeUnit.SECONDS,//时间单位,这里为秒 new ArrayBlockingQueue(3),//阻塞队列,不能为null Executors.defaultThreadFactory(),//创建线程工厂,不能为null new ThreadPoolExecutor.AbortPolicy()//任务的拒绝策略,不能为null );

补充线程池大小的选择: 最大并行数:与电脑的CPU型号有关。 在这里插入图片描述 上图中的电脑为4核8线程。 4核8线程可以理解为CPU有4个大脑,能同时做4件事情,而Intel采用超线程技术,将4个大脑虚拟成8个,能同时做8件事,此时最大并行数为8。 注意:极少数操作系统不会把所有的内核给一个软件,所以从任务管理器中查看并不一定对,可以利用如下代码查看; 在这里插入图片描述 程序分为两种,一种是CPU密集型运算,另一种是I/O密集型运算。若是CPU密集型运算,线程池大小= 最大并行数+1;若是I/O密集型运算(读取本地文件或数据库操作较多),线程池大小= 最大并行数 X 期望 CPU利用率X总时间/CPU计算时间,其中总时间=CPU计算时间+等待时间。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有