自己做的工艺品在哪个网站上可以卖,wordpress首页打开变慢,大连网站建设,惠州建设网站开发文章目录 什么是线程池#xff1f;线程池的实现标准库中的线程池#xff08;四种#xff09;自己实现一个线程池 线程池支持的参数在实际的开发中#xff0c;线程池的线程数如何确定#xff1f; 什么是线程池#xff1f;
线程诞生的原因就是进程太“重量”了。虽然线程的… 文章目录 什么是线程池线程池的实现标准库中的线程池四种自己实现一个线程池 线程池支持的参数在实际的开发中线程池的线程数如何确定 什么是线程池
线程诞生的原因就是进程太“重量”了。虽然线程的速度已经比进程快了很多但是如果遇到频繁的创建和销毁线程的情况那么线程创建和销毁的开销仍不可忽略。这时候就可以使用线程池来进一步提高使用线程的效率。
线程池就是一个“池子”里有很多线程。当需要执行任务的时候不需要重新创建线程而是直接从“池子”里面取一个线程直接使用用完了也不需要销毁再放回“池子”里就行。 为什么从“池子”里取一个线程比创建一个线程快呢 从“池子”里取的操作是一个纯用户态的操作而创建一个线程涉及到了用户态到内核态的转化。很容易理解转化走的路程远自然执行速度就慢。用户态每个进程自己执行自己的逻辑内核态一个操作系统只有一个内核一个内核要给所有的进程提供服务。线程本质是一个PCB是内核中的数据结构。创建和销毁就要到内核中。 线程池的实现
标准库中的线程池四种 //标准库的线程池public static void main(String[] args) {//创建线程数目动态增长的线程池ExecutorService pool Executors.newCachedThreadPool();//创建固定线程数的线程池ExecutorService pool1 Executors.newFixedThreadPool(5);//创建只包含单个线程的线程池ExecutorService pool2 Executors.newSingleThreadExecutor();//创建定期执行命令的线程池ExecutorService pool3 Executors.newScheduledThreadPool(5);pool.submit(new Runnable() {Overridepublic void run() {System.out.println(线程池);}});}自己实现一个线程池
一个线程池可以同时提交N个任务有M个线程同时执行这些任务。 使用生产者消费者模型来解决这个问题。
class MyThreadPool{private BlockingQueueRunnable blockingQueue new LinkedBlockingDeque();public void submit(Runnable runnable){try {blockingQueue.put(runnable);} catch (InterruptedException e) {e.printStackTrace();}}public MyThreadPool(int m){for (int i 0; i m; i){Thread thread new Thread(() - {while (true){try {Runnable runnable blockingQueue.take();runnable.run();} catch (InterruptedException e) {e.printStackTrace();}}});thread.start();}}
}线程池支持的参数 corePoolSize核心线程数 maximumPoolSize最大线程数 最大线程数 核心线程数 临时线程数
keepAliveTime允许临时线程空闲的时间 unit时间的单位
workQueue手动给线程池传一个任务队列 threadFactory描述了线程是如何创建的。 工厂对象就负责创建线程程序员可以手动指定创建线程的策略
handler线程池的拒绝策略。即线程池的任务队列已经满了但是还有人往进添加新的任务该怎么办 解释 策略一不光新添加的任务不干旧的任务也不干 策略二让传递任务的线程干如果它不干就把这个任务舍弃 策略三不干新添加的任务继续执行旧的任务 策略四干新添加的任务把旧任务中最早添加进来的任务舍弃
在实际的开发中线程池的线程数如何确定
盖棺定论线程数是不能确定的需要根据具体的情况具体分析。
因为
主机的CPU配置不确定。CPU越多可创建的线程数越多。不同程序的执行特点不确定。得看你的代码是干啥的 如果是100%CPU密集型任务进行大量的算术运算和逻辑判断线程数有最大值比如N。线程数就算再多也没用因为CPU已经被占满了。如果是10%CPU密集型、90%IO密集型任务进行大量的读写硬盘/网卡操作线程数可以为10N
但是在工作中两种任务各占比多少是不确定的。因此需要我们进行实验验证
针对自己的程序进行性能测试分别给线程池设置不同的线程数比如0.2N、0.5N、N、1.5N、2N.分别记录每种情况下你的程序的一些核心性能指标和负载情况选择一个适合的线程数即可。