目录
一、引言
我们可以创建多线程了为什么要用多线程池?
服务器在创建和销毁线程上花费的时间和消耗的系统资源都相当大,甚至可能要比在处理实际的用户请求的时间和资源要多的多;如果在一个jvm里创建太多的线程,可能会使系统由于过度消耗内存或“切换过度”而导致系统资源不足;
线程池主要用来解决线程生命周期开销问题和资源不足问题,简单来讲就是管理线程的池子,类似数据库连接池,如果自己写的话通过监听线程的生命周期也可以写出来。
二、多线程池种类
- newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
- newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
- newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
- newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
三、多线程池实现
举个简单的例子创建定长的多线程池newFixedThreadPool
public class TestThreadpool {
public static void main(String [] args)
{
ExecutorService fixPool = Executors.newFixedThreadPool(5);
for(int i=0;i<10;i++)
{
fixPool.execute(new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName()+"输出");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}));
}
}
}
输出结果:每次最多只能执行五个线程,多的话就只能排队等待
pool-1-thread-1输出
pool-1-thread-2输出
pool-1-thread-3输出
pool-1-thread-4输出
pool-1-thread-5输出
pool-1-thread-3输出
pool-1-thread-5输出
pool-1-thread-4输出
pool-1-thread-2输出
pool-1-thread-1输出
四、总结
- 多线程池种类;
- 多线程池实现;