package cn.tarena.threadpool;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import org.junit.Test;
/**
* 学习线程池的使用
* ①corePoolSize:核心线程数量
* ②maximumPoolSize:最大线程数量
* ③keepAliveTime:存活时间
* ④unit:时间单位
* ⑤workQueue:队列
*
* 知识点1:使用线程池的目的是避免线程的频繁创建和销毁,从而提高性能,节省资源。
* 知识点2:当线程池中,有新的请求时,当线程数量小于核心线程数量,会创建新的线程来处理请求。
* 知识点3:当核心线程满时,但等待未满时,有新的请求到达时,会进入队列进行排队等待
* 知识点4:当核心线程满,队列满时,再有新线程达到时,会产生新线程,
* 知识点5:当请求超过线程池的处理上限时,就将请求交给拒绝服务器助手来处理
* 新线程数+核心线程数<=最大线程数
* 知识点6:keepAliveTime限定的是临时线程的闲置时间,超过此时间,临时线程会被销毁
* 核心线程是不会被销毁的,除非关闭线程池
* 知识点7:shutdown()方法关闭线程池,在调用shutdown()后,线程池不会接受新的请求,
* 知识点8:线程池通过execute方法启动线程
* 此外,并不是马上关闭,而是等到池里所有线程完成工作后再关闭。
*
*
*/
public class TestThreadPool {
@Test
public void testCreate(){
ExecutorService es=new ThreadPoolExecutor(
5,10,3000,TimeUnit.MILLISECONDS,
new ArrayBlockingQueue<Runnable>(5),new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
System.out.println("当前队列已满,请等待");
}
});
for(int i=0;i<16;i++){
es.execute(new ExRunner());
}
es.shutdown();
while(true);
}
/*newCachedThreadPool线程池:
* 0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>()
*①没有核心线程
*②都是临时线程
*③池子容量非常大(大池子)
*④存活时间较短
*⑤小队列
*大池子小队列的适用场景:很好的响应用户请求,可以处理很高的并发访问。
*但是注意:如果是高并发但是长请求的话,会造成线程数量一直增大却得不到销毁,可能会造成堆溢出
*此外,也会带来一定的线程创建和销毁的性能损耗。
*
*newFixedThreadPool线程池:
*nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()
*①都是核心线程,没有临时线程
*②未设定存活时间(因为没有临时线程)
*③大队列
*小池子大队列的适用场景:可以用于缓解高峰时的负载压力,相当于通过队列启动缓冲作用。
*此外由于核心线程没有销毁的过程,所以性能很好。
*缺点:可能不能及时的处理用户的请求。
*
*在设计线程池的时候,不要设计小池子小队列这种模式。
*/
public void testCreate_Simple(){
ExecutorService es=Executors.newCachedThreadPool();
ExecutorService es2=Executors.newFixedThreadPool(10);
}
}
class ExRunner implements Runnable{
@Override
public void run() {
System.out.println("hello");
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Java线程池
最新推荐文章于 2025-02-28 22:23:46 发布