今天就跟大家聊聊有关在java项目中使用线程池实现并发编程,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
执行人可以将任务的提交和任务的执行策略解耦
只有任务是同类型的且执行时间差别不大,才能发挥最大性能,否则,如将一些耗时长的任务和耗时短的任务放在一个线程池,除非线程池很大,否则会造成死锁等问题
类似于:将两个任务提交给一个单线程池,且两个任务之间相互依赖,一个任务等待另一个任务,则会发生死锁;表现为池不够
定义:某个任务必须等待池中其他任务的运行结果,有可能发生饥饿死锁
注意:线程池的大小还受其他的限制,如其他资源池:数据库连接池
如果每个任务都是一个连接,那么线程池的大小就受制于数据库连接池的大小
<强>实例:强>
1。通过执行人的工厂方法返回默认的一些实现
2。通过实例化ThreadPoolExecutor (.....)自定义实现
<强>线程池的队列强>
任务到达,线程池饱满,则任务在队列中等待,如果任务无限达到,则队列会无限扩张
如:单例和固定大小的线程池用的就是此种
如果新任务到达,队列满则使用
如果线程池很大,将任务放入队列后在移交就会产生延时,如果任务生产者很快也会导致任务排队
SynchronousQueue直接将任务移交给工作线程
机制:将一个任务放入,必须有一个线程等待接受,如果没有,则新增线程,如果线程饱和,则拒绝任务
如:CacheThreadPool就是使用的这种策略
setRejectedExecutionHandler来修改饱和策略
<强>每当创建线程时:>强其实是调用了线程工厂来完成
<>强自定义线程工厂:强>实现ThreadFactory
<强>可以定制该线程工厂的行为:>强如UncaughtExceptionHandler等
可以被自定义子类覆盖的方法:
1. afterexecute:结束后,如果抛出RuntimeException则方法不会执行
2. beforeexecute:开始前,如果抛出RuntimeException则任务不会执行
3。终止:在线程池关闭时,可以用来释放资源等
在循环中,每次循环操作都是独立的
//串行化 空白processSequentially (List元素){ (元素e:元素) 过程(e); }//并行化 空白processInParallel(执行人exec List 元素){ (最后一个元素e:元素) 执行。执行(新Runnable () { 公共空间run () { 过程(e); } }); }
如果每个迭代操作是彼此独立的,则可以串行执行
如:深度优先搜索算法;注意:递归还是串行的,但是,每个节点的计算是并行的
//串行计算计算和串行迭代 公共& lt; T>空白sequentialRecursive (List在java项目中使用线程池实现并发编程