1、什么是线程池?
线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。
2、线程池的优势
(1)、降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗;
(2)、提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行;
(3)方便线程并发数的管控。因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换(cpu切换线程是有时间成本的(需要保持当前执行线程的现场,并恢复要执行线程的现场))。
(4)提供更强大的功能,延时定时线程池。
3、线程池工作流程
4、线程池的使用步骤
1.使用线程池的工厂类Executors里面提供的静态方法newFixedThreadPool生产一个指定数量的线程池。
2.创建一个类,实现Runnable接口,重写run()方法,设置线程任务
3.调用ExecutorService中的submit()方法,传递线程任务(实现类),开启线程,执行run()方法。
4.调用ExecutorService中的shutdown()方法销毁线程池(一般不建议执行,除非不使用多线程了)。
5、实例演示线程池的简单使用
package threadpool;
public class RunnableImpl implements Runnable {
public void run(){
System.out.println(Thread.currentThread().getName()+"创建一个新的线程");
}
}
package threadpool;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 线程池的使用步骤:
* 1.使用线程池的工厂类Executors里面提供的静态方法newFixedThreadPool生产一个指定数量的线程池。
* 2.创建一个类,实现Runnable接口,重写run()方法,设置线程任务
* 3.调用ExecutorService中的submit()方法,传递线程任务(实现类),开启线程,执行run()方法。
* 4.调用ExecutorService中的shutdown()方法销毁线程池(一般不建议执行,除非不使用多线程了)。
*
*/
public class DemoThreadPool {
public static void main(String[] args) {
int count = 15;
//创建一定数量的线程池对象
ExecutorService executorService = Executors.newFixedThreadPool(3);
while(count>0){
//设置线程任务,并开启线程池
executorService.submit(new RunnableImpl());
count--;
}
//销毁线程池
executorService.shutdown();
}
}
执行结果: