作者:qapo | 来源:互联网 | 2023-07-20 12:28
线程池的实现原理(1)线程判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下个流程。(2)线程池判断工
线程池的实现原理
(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处于已完成状态。
当FutureTask处于未启动或已启动状态时,执行FuturTask.get()方法将导致调用线程阻塞;当FutureTask处于已完成状态时,执行FuturTask.get()方法将导致调用线程立即返回结果或抛出异常。
当FutureTask处于未启动状态时,执行FutureTask.cancel()方法将导致此任务永远不会被执行;当FutureTask处于已启动状态时,执行FutureTask.cancel(true)方法将以中断执行此任务线程的方式来视图停止任务;当FutureTask处于已启动状态时,执行FutureTask.cancel(false)方法将不会对正在执行此任务的线程产生影响(让正在执行的任务运行完成);当FutureTask处于已完成状态时,执行FutureTask.cancel(…)方法将返回false。