四种线程池:
1.newFixedThreadPool()方法:该方法返回一个固定线程数量的线程池。线程池中的线程数量始终不变,当新任务提交若有空闲线程则立即执行,没有,则新的任务会暂存在一个任务队列中,待有线程空闲时,便处理任务队列中的任务。
2.newSingleThreadExecutor()方法:该方法返回一个只有一个线程的线程池。该任务队列是一个先进先出的顺序执行队列。
3.newCachedThreadPool()方法:该方法返回一个根据实际情况调整线程数量的线程池。若所有线程均在工作,又有新的任务提交,则会创建新的线程处理任务,用完完毕放回线程池复用。
4.newScheduleThreadPool()方法:创建固定长度的线程池,且同时以延时或者定时的方法执行任务。
如何确定线程池大小(cpu密集型通常设置Ncpu+1,io密集型数量设置的应该更多)
并发库中的blockingqueue(阻塞队列),主要提供了两个方法put()和take()
前者将对象放到队列中,如果队列已满,就等待有空闲。后者从head取一个对象,如果没有对象就等到有对象。
FixedThreadPool与SingleThreadPool都是采用的无界linkedblockingqueue实现。linkedblockingqueue中引入了两把锁takelock和putlock,显然分别用于take操作和put操作。入队出队用不同锁,可以同时进行入队出队操作。由于其实链表,查找较慢。
CacheThreadPool使用的时synchronousqueue队列,该队列是一种直接提交队列。
线程池主要使用的队列分几种
有界队列
无界队列
直接提交队列
优先任务队列