一、线程池基础
1、什么是线程池
用一句话来概述就是:线程池是指在初始化一个多线程应用程序过程中创建一个线程集合,然后再需要执行新的任务时重用这些线程而不是新建线程。
2、为什么使用线程池
使用线程池最大的原因就是可以根据系统的需求和硬件环境灵活的控制线程的数量,且可以对所有线程进行统一的管理和控制,从而提高系统的运行效率,降低系统的运行压力。
3、线程池有哪些优势
降低资源消耗:线程和任务分离,提高线程重用性
控制线程并发数量,降低服务器压力,统一管理所有线程
提高系统响应速度。假如创建线程用的时间为T1,执行任务的时间为T2,销毁线程的时间为T3,那么使用线程池就免去了T1和T3的时间。
二.线程池的创建
线程池的创建有两种,一种是规定线程数量,另一种是不规定,封顶线程数为int类型的极限
1.不规定线程的个数,直接为int的极限
//创建线程池
ExecutorService pool1= Executors.newCachedThreadPool();
//2.提交任务
pool1.submit(new MyRunable());
pool1.submit(new MyRunable());
pool1.submit(new MyRunable());
pool1.submit(new MyRunable());
pool1.submit(new MyRunable());
//销毁线程池
pool1.shutdown();
因为我们开启了五个任务,所以线程的个数最多就是5个,然后我们再来尝试一下不规定线程个数的情况
当我们对线程池有了最大线程的规定的时候,线程的最大数量就是3不会因此发生改变 ,因此我们在项目中也可以实现线程池的应用,在服务器中开一个线程池去处理每一次客户的请求
ExecutorService pool2=Executors.newFixedThreadPool(3);
//2.提交任务
pool2.submit(new MyRunable());
pool2.submit(new MyRunable());
pool2.submit(new MyRunable());
pool2.submit(new MyRunable());
pool2.submit(new MyRunable());
//销毁线程池
pool2.shutdown();
当你想要线程池能够睡眠一会儿的时候就可以用到这个方法
newScheduledThreadPool
创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3);
scheduledThreadPool.schedule(newRunnable(){
@Override
public void run() {
System.out.println("延迟三秒");
}
}, 3, TimeUnit.SECONDS);
scheduledThreadPool.scheduleAtFixedRate(newRunnable(){
@Override
public void run() {
System.out.println("延迟 1 秒后每三秒执行一次");
}
},1,3,TimeUnit.SECONDS);