线程池的类体系结构多线程

JAVA API 架构架构

- 首先明确必定是在Java里面能够供使用者调用的启动线程类是Thread。所以Runnable或者Timer/TimerTask等都是要依赖Thread来启动的,所以在ThreadPool里面一样也是靠Thread来启动多线程的。
- 默认状况下Runnable接口执行完毕后是不能拿到执行结果的,所以在ThreadPool里就定义了一个Callable接口来处理执行结果。
- 为了异步阻塞的获取结果,Future能够帮助调用线程获取执行结果。
- Executor解决了向线程池提交任务的入口问题,同时ScheduledExecutorService解决了如何进行重复调用任务的问题。
- CompletionService解决了如何按照执行完毕的顺序获取结果的问题,这在某些状况下能够提升任务执行的并发,调用线程没必要在长时间任务上等待过多时间。
- 显然线程的数量是有限的,并且也不宜过多,所以合适的任务队列是必不可少的,BlockingQueue的容量正好能够解决此问题。
- 固定任务容量就意味着在容量满了之后须要必定的策略来处理过多的任务(新任务),RejectedExecutionHandler正好解决此问题。
- 必定时间内阻塞就意味着有超时,所以TimeoutException就是为了描述这种现象。TimeUnit是为了描述超时时间方便的一个时间单元枚举类。
- 配置一个合适的线程池是很复杂的,所以Executors默认的一些线程池配置能够减小这个操做。
小福利:知乎上回答的关于并发的书籍和博客 点击查看并发