专门做图片是网站,wordpress 足迹地图,深圳建设厅官方网站,宣传片制作公司推荐文章目录 线程池的概念池的目的线程池的优势为什么从池子里拿线程更高效#xff1f;构造方法参数讲解线程拒绝策略模拟实现线程池一个线程池设置多少线程合适#xff1f; 线程池的概念
线程池#xff1a;提前把线程准备好#xff0c;创建线程不是直接从系统申请#xff0… 文章目录 线程池的概念池的目的线程池的优势为什么从池子里拿线程更高效构造方法参数讲解线程拒绝策略模拟实现线程池一个线程池设置多少线程合适 线程池的概念
线程池提前把线程准备好创建线程不是直接从系统申请而是从池子里拿线程不用了还给池子。 复用线程平摊线程的创建与销毁的开销代价
池的目的
池的目的是提高效率线程的创建虽然比进程轻量频繁创建开销也不可忽略
线程池的优势
1、避免了线程的重复创建与开销带来的资源消耗代价 2、提升了任务响应速度任务来了直接选一个线程执行而无需等待线程的创建 3、线程的统一分配和管理也方便统一的监控和调优
为什么从池子里拿线程更高效
从池子里拿线程纯粹的用户态操作。 从系统创建线程涉及到用户态和内核态的切换真正的切换是在内核态完成的。 结论纯用户态操作时间可控涉及到内核操作不可控。
构造方法参数讲解 参数说明corePoolSize核心线程数maximumPoolSize最大线程数keepAliveTime线程保持存活时间TimeUnit unit时间单位workQueue因为线程池要管理很多任务这些任务通过阻塞队列来阻止的程序员可以手动给线程池一个阻塞队列。submit方法就是把任务放到队列中threadFactory工厂模式创建线程的辅助类handler线程池拒绝策略
线程拒绝策略 1、如果满了继续添加任务添加操作跑出异常。 2、添加的线程自己负责执行这个任务。 3、丢弃最老任务 4、丢弃最新的任务
模拟实现线程池
package Test1;import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;public class ThreadDemo3 {//阻塞队列添加任务private BlockingQueueRunnablequeuenew LinkedBlockingQueue();//将任务添加到队列中public void submit(Runnable runnable){try {queue.put(runnable);} catch (InterruptedException e) {throw new RuntimeException(e);}}//定义线程数量public ThreadDemo3(int n){for(int i1;in;i){Thread tnew Thread(()-{while(true) {try {Runnable runnable queue.take();//取任务runnable.run();//执行任务} catch (InterruptedException e) {e.printStackTrace();}}});//启动线程t.start();}}
}
一个线程池设置多少线程合适
首先 线程并不是越多越好多少合适取决于CPU。 其次 不同程序线程要做的活也不一样 1、CPU密集型任务主要做一些计算工作要在CPU上运行。 2、IO密集型任务主要是等待IO操作不咋吃CPU 假设你的线程全是任务全是使用CPU密集型任务线程数就不能超过核心数逻辑核心数如果是IO任务则可以超过核心数。 但是具体还是要通过测试方式来确定计算执行时间同时检测资源使用状态测试多次取均值。