在java项目中使用线程池实现并发编程

  介绍

今天就跟大家聊聊有关在java项目中使用线程池实现并发编程,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

执行人可以将任务的提交和任务的执行策略解耦

只有任务是同类型的且执行时间差别不大,才能发挥最大性能,否则,如将一些耗时长的任务和耗时短的任务放在一个线程池,除非线程池很大,否则会造成死锁等问题

类似于:将两个任务提交给一个单线程池,且两个任务之间相互依赖,一个任务等待另一个任务,则会发生死锁;表现为池不够

定义:某个任务必须等待池中其他任务的运行结果,有可能发生饥饿死锁

霸趈ava项目中使用线程池实现并发编程"

注意:线程池的大小还受其他的限制,如其他资源池:数据库连接池

如果每个任务都是一个连接,那么线程池的大小就受制于数据库连接池的大小

<强>实例:

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项目中使用线程池实现并发编程