专业编程培训机构——完成蜕变以后轻松拿高薪
电话+V: 152079-09430 ,欢迎咨询java如何自己创建线程池数据库,[python实用课程],[C++单片机原理],[C#网站搭建],[Nodejs小程序开发],[ios游戏开发],[安卓游戏开发],[教会用大脑用想法赚钱实现阶层跨越]
一、java四种线程池创建
探索Java线程池的四大奥秘
在Java并发编程的世界里,线程池是不可或缺的组件,它们能够有效管理并控制线程资源,提高程序的性能和可维护性。这里有四种关键的线程池创建方式,每一种都有其独特的应用场景和特点。
1.固定大小的守护者-newFixedThreadPool
Executors工具类中的newFixedThreadPool方法,为你提供了一个定制化的线程池,核心线程数是固定的,没有最大线程数的限制。在控制并发任务和资源分配方面,它扮演着关键角色。通过指定corePoolSize参数,如nThreads,你可以精确设定基础线程数量。工作队列使用LinkedBlockingQueue,当任务超出核心线程处理能力时,maximumPoolSize默认为0,表示无限制,但可以通过自定义threadFactory和handler来处理拒绝策略。
2.有序执行的单线程世界-newSingleThreadExecutor
对于需要保证任务顺序执行的场景,newSingleThreadExecutor线程池是你的理想选择。它只有一个核心线程,corePoolSize和maximumPoolSize均设为1,确保任务按提交顺序逐一执行。工作队列同样采用LinkedBlockingQueue,当任务过多时,拒绝策略默认为RejectedExecutionException。
3.灵活适应的短暂工作者-newCachedThreadPool
对于短期且需要处理大量异步任务的情况,newCachedThreadPool是一个高效的解决方案。它以0为corePoolSize,自动调整线程数量,直到达到最大值maximumPoolSize(默认Integer.MAX_VALUE)。线程在空闲超过keepAliveTime(默认60秒)后会被回收。工作队列使用SynchronousQueue,以最小化线程阻塞。
定时和周期任务的守护者-newScheduledThreadPool
最后,newScheduledThreadPool用于处理需要定时或周期执行的任务。它的核心线程数固定,使用DelayedWorkQueue作为任务队列。构造方法中,你可以设定corePoolSize、maximumPoolSize、keepAliveTime、unit等参数,并通过threadFactory和handler定制线程和拒绝策略。DelayedWorkQueue继承自BlockingQueue,提供如put、poll等方法,而Delayed接口则为任务的延迟执行提供了时间限制。
通过理解并灵活运用这些线程池,你可以更好地组织和管理你的Java并发任务,实现更高效的程序设计。
二、线程池的四种创建方式及区别
核心线程数为0,非核心线程数为MAX_VALUE,
队列不存储值,总认为队列是满的,所以每次执行任务时都会创建非核心线程,非核心线程空闲了超过60秒(默认),就会自动回收。
2.newfixedThreadPool创建定长的线程池
在达到长度之前,每提交一个任务都会创建一个线程,如果达到线程池最大数量,则提交到队列中,在空闲的时候也不会自动回收线程
核心线程数为参数传入,非核心线程数和核心线程数一样,
队列为无界队列,资源有限的时候容易引起OOM.
与newSingledThreadPool不同的是核心线程数不为1.
3.newSingledThreadPool创建单一线程执行。
只有一个线程按顺序执行任务,如果这个线程出现异常结束,会有另一个线程取代并按顺序执行。
corepoolsize核心线程数为1,非核心线程数为1,
队列为无界队列,
单工作线程最大的特点是可保证顺序地执行各个任务,并且在任意给定的时间不会有多个线程是活动的。
4.newScheduedThreadPool创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行。如果延迟3秒执行或每隔3秒执行一次
核心线程数为参数设定,非核心线程数为MAX_VALUE
定义了一个DelayedWorkQueue,它是一个有序队列,会通过每个任务按照距离下次执行时间间隔的大小来排序;
线程池执行逻辑说明:
判断核心线程数是否已满,核心线程数大小和corePoolSize参数有关,未满则创建线程执行任务
若核心线程池已满,判断队列是否满,队列是否满和workQueue参数有关,若未满则加入队列中
若队列已满,判断线程池是否已满,线程池是否已满和maximumPoolSize参数有关,若未满创建线程执行任务
若线程池已满,则采用拒绝策略处理无法执执行的任务,拒绝策略和handler参数有关
拒绝策略
拒绝策略=>默认采用的是AbortPolicy拒绝策略,直接在程序中抛出RejectedExecutionException异常【因为是运行时异常,不强制catch】,这种处理方式不够优雅。处理拒绝策略有以下几种比较推荐:
在程序中捕获RejectedExecutionException异常,在捕获异常中对任务进行处理。针对默认拒绝策略
使用CallerRunsPolicy拒绝策略,该策略会将任务交给调用execute的线程执行【一般为主线程】,此时主线程将在一段时间内不能提交任何任务,从而使工作线程处理正在执行的任务。此时提交的线程将被保存在TCP队列中,TCP队列满将会影响客户端,这是一种平缓的性能降低
自定义拒绝策略,只需要实现RejectedExecutionHandler接口即可
如果任务不是特别重要,使用DiscardPolicy和DiscardOldestPolicy拒绝策略将任务丢弃也是可以
publicclassThreadTest{
//ScheduledExecutorServicescheduledThreadPool=Executors.newScheduledThreadPool(5);
//
//scheduledThreadPool.scheduleAtFixedRate(newRunnable(){
//publicvoidrun(){
//System.out.println("delay1seconds,andexcuteevery3seconds");
//
//}
//
//},1,3,TimeUnit.SECONDS);
三、创建线程推荐使用哪些方法
推荐使用的方法来创建线程是使用线程库中的高级接口,比如Java中的java.util.concurrent包中的ExecutorService和FutureTask,或者Python的concurrent.futures模块。
Java中的ExecutorService
在Java中,ExecutorService提供了一个高级别的线程池接口,使得线程的管理和控制更为方便。你可以创建固定大小的线程池,这样你就可以控制并发的线程数量。ExecutorService提供了submit和invokeAll等方法来提交任务,获取执行结果。
例如:
java
ExecutorServiceexecutor=Executors.newFixedThreadPool(5);
for(inti=0;i<10;i++){
executor.submit(()->{
//你的任务代码
});
}
executor.shutdown();//关闭线程池
Java中的FutureTask
FutureTask是Java中的一种可取消的异步计算。它提供了Future的基本实现,具有启动和取消计算、查询计算是否完成以及检索计算的结果等方法。只有当计算完成时才能检索结果,如果计算尚未完成,则阻塞get方法。
例如:
java
FutureTaskfutureTask=newFutureTask>(()->{
//你的任务代码
return"任务结果";
});
newThread(futureTask).start();
try{
System.out.println(futureTask.get());//输出:"任务结果"
}catch(InterruptedException|ExecutionExceptione){
e.printStackTrace();
}
Python中的concurrent.futures
在Python中,concurrent.futures模块实现了一个高级的接口,用于异步执行可调用的对象。线程池执行器ThreadPoolExecutor和进程池执行器ProcessPoolExecutor都实现了这个接口。两者都提供了map方法来异步执行函数的调用,并阻塞直到结果就绪。
例如:
python
fromconcurrent.futuresimportThreadPoolExecutor
deftask(n):
#你的任务代码
returnn*2
withThreadPoolExecutor(max_workers=5)asexecutor:
results=executor.map(task,range(10))
print(results)#输出:[0,2,4,6,8,10,12,14,16,18]
【FUTURE PROGRAMMING COURSE】尊享对接老板
电话+V: 152079-09430
机构由一批拥有10年以上开发管理经验,且来自互联网或研究机构的IT精英组成,负责研究、开发教学模式和课程内容。公司具有完善的课程研发体系,一直走在整个行业发展的前端,在行业内竖立起了良好的品质口碑。