谈谈对线程池的理解?如何创建线程池?java.util.concurrent包中提供了哪几种线程池?分别说明。
线程池就是首先创建一些线程,这些线程的集合被称之为线程池。线程池可以很大程度上的提高工作效率。在java中使用ThreadPoolExetor 来创建线程池。在使用线程池以后,程序会将一个任务交给线程,当任务结束后,线程会回到线程池中,而不是将线程销毁。
线程池的工作机制:
1:在处于线程池工作模式下,会首先创建一些线程,而这些线程的集合就被称之为线程池,系统在执行任务的时候,不会将任务交给线程,而是交给线程池,线程池会掉用莫格空闲的线程
2:线程池和线程一样拥有自己的状态,首先线程池会创建一个volilate变量,用来ilu线程池的工作状态。线程池有四种工作状态:running,stop,shutdomn,tearmnated;
3:线程池在创建的时候会处于running状态。
4:在执行shutdomn命令后,线程池不能接受新的线程,会等待缓冲队列的执行。
5: 在执行shutdomnnow的时候,线程池会处于stop状态,线程不能执行新的任务,并且尝试终止正在执行的线程,
6:在线程池处于shutdomn或者stop的情况下的时候,并且所有的工作线程已经销毁,或者任务缓存队列已经清空的情况下,线程池会处于streamNated状态。
缓存队列:有三种。
| 队列 | 简单解释 |
|---|
| SynchrousQueue | 不会保存提交任务,超出直接corePoolSize个任务,直接创建新的线程来执行任务,直到(corePoolSize+新建线程)> maximumPoolSize。不是核心线程就是新建线程 |
| LinkedBlockingQueue | 基于链表的先进先出,无界队列。超出直接corePoolSize个任务,则加入到该队列中,直到资源耗尽,所以maximumPoolSize不起作用 |
| ArrayBlockingQueue | 基于数组的先进先出,创建时必须指定大小,超出直接corePoolSize个任务,则加入到该队列中,只能加该queue设置的大小,其余的任务则创建线程,直到(corePoolSize+新建线程)> maximumPoolSize |
缓存队列的作用:当线程池的线程不够处理任务的时候,会将任务放在队列中,起到一个缓存的作用。
常用的线程池有四种:
newCacheThreadPool:
newFixedThreadPool;
newScheduledThreadPool;
newSingleThreadPool;
2:1. 请描述Comparable 和 Comparator 接口?列出它们的区别。