Java并发编程(七)——Java中的线程池

线程池的实现原理

Java并发编程(七)——Java中的线程池

(1)线程判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下个流程。
(2)线程池判断工作队列是否已满。如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下个流程。
(3)线程池判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程来执行任务。如果已经满了,则交给饱和策略来处理这个任务。

线程池的使用

向线程池提交任务

可以使用两个方法向线程池提交任务,分别为execute()和submit()方法。
execute()方法用于提交不需要返回值的任务,所以无法判断任务是否被线程池执行成功。

FutureTask简介

FutureTask的3种状态:
1、未启动。FuturTask.run()方法还没有被执行前,FutureTask处于未启动状态。当创建一个FutureTask,且没有执行FuturTask.run()方法之前,这个FutureTask就处于未启动状态。

2、已启动。FuturTask.run()方法被执行的过程中,FutureTask处于已启动状态。

3、已完成。FuturTask.run()方法执行完成后正常结束,或被取消(FutureTask.cancel(…)),或执行FuturTask.run()方法是抛出异常而异常结束,FutureTask处于已完成状态。

Java并发编程(七)——Java中的线程池
当FutureTask处于未启动或已启动状态时,执行FuturTask.get()方法将导致调用线程阻塞;当FutureTask处于已完成状态时,执行FuturTask.get()方法将导致调用线程立即返回结果或抛出异常。
当FutureTask处于未启动状态时,执行FutureTask.cancel()方法将导致此任务永远不会被执行;当FutureTask处于已启动状态时,执行FutureTask.cancel(true)方法将以中断执行此任务线程的方式来视图停止任务;当FutureTask处于已启动状态时,执行FutureTask.cancel(false)方法将不会对正在执行此任务的线程产生影响(让正在执行的任务运行完成);当FutureTask处于已完成状态时,执行FutureTask.cancel(…)方法将返回false。

Java并发编程(七)——Java中的线程池