深圳网站建设服务商哪些好?,wordpress 地址栏,wordpress 4.5.7,全国建设工程造价管理系统线程池的基本原理#xff1a;
无论是之前在JavaSE基础中#xff0c;我们学习过的常量池#xff0c;还是在操作数据库时#xff0c;我们学习过数据库连接池#xff0c;以及接下来要学习的线程池#xff0c;均是一种池化思想#xff0c;其目的就是为了提高资源的利用率
无论是之前在JavaSE基础中我们学习过的常量池还是在操作数据库时我们学习过数据库连接池以及接下来要学习的线程池均是一种池化思想其目的就是为了提高资源的利用率线程池顾名思义就是对线程对象的一种优化如果不使用线程池那么我们对线程的操作即为手动创建线程对象执行任务任务执行完毕释放线程对象映射到我们生活为我们每次打电话都需要买一个手机每次打完电话就将手机扔掉那么这样一来无疑是非常的铺张浪费而线程池就类似于将手机重复利用而不是每次都换新的它能很好地提高资源的利用率并且由于线程对象是提前创建好的因此也能够提高程序的响应速度。
下面我使用日常生活中最常见的一个例子来说明线程池的原理
我们可以将海底捞作为一个线程池那么海底捞中的桌子可以看作是线程对象假设当前店中已经有3张空闲的桌子可以使用此时来了4组可以需要吃饭那么服务员会根据先后顺序先安排前3组客人进行就餐剩下的一组客人需要进入等待区随后来的客人都会进入等待区但是等待区的位置也不是无穷无尽的啊假设我们的等待区只能最多让2个用户进行等待当前如果又来了一个客人那么就会出现他们既没有空闲的餐桌供他们使用等待区也没有空闲的位置那么此时由于客人并发量太大了海底捞的老板就会触发一种应急方案就是在当前餐厅空旷的区域加桌子那么等待区中的第一位客人就可以从等待区中出来了呀刚刚没有办法处理的客人此时就可以加入等待区中加桌子是挺好的但是也不能无限加啊因为餐厅可使用的地方是有限的当达到最大值后又来了一位客人那么服务员只好拒绝接待该客人
使用Java简单模拟实现线程池
package org.example;import java.util.concurrent.*;public class Main {public static void main(String[] args) {//3--表示核心的线程对象数量也就是上述海底捞例子中没加桌子前的餐厅桌子数量//5--表示最大线程对象的数量也就是上述海底捞例子中该餐厅最多可容纳的桌子数量//1和后面的TimeUnit.SECONDS表示1秒钟没有任务就可以停止工作了//ArrayBlockingQueue--表示一个等待队列//defaultThreadFactory--调用默认的工厂//AbortPolicy拒绝策略//ExecutorService是Java提供的线程池ExecutorService executorServicenew ThreadPoolExecutor(3,5,1L, TimeUnit.SECONDS,new ArrayBlockingQueue(3), Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());for (int i0;i9;i){executorService.execute(()-{System.out.println(Thread.currentThread().getName()办理业务);});}executorService.shutdown();}
}输出如下所示
当前线程池最多可容纳线程的数量为8那么到第九个线程就会触发拒绝策略
pool-1-thread-1办理业务
pool-1-thread-5办理业务
pool-1-thread-4办理业务
pool-1-thread-3办理业务
pool-1-thread-2办理业务
pool-1-thread-4办理业务
pool-1-thread-1办理业务
pool-1-thread-5办理业务
Exception in thread main java.util.concurrent.RejectedExecutionException: Task org.example.Main$$Lambda$1/1283928880682a0b20 rejected from java.util.concurrent.ThreadPoolExecutor3d075dc0[Running, pool size 5, active threads 5, queued tasks 3, completed tasks 0]at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)at org.example.Main.main(Main.java:15)