若是有大量任务需要请求访问服务器,那么需要为每一个任务创建一个线程,会创建大量的线程,在程序结束以后会将线程全部销毁。
频繁的创建线程,或者创建过多的线程都会给系统带来风险,轻则拖慢系统,出现卡顿现象,严重的话可能出现内存溢出系统瘫痪,因为我们在创建并发量大得业务逻辑时,常常使用线程池来管理和调度线程。
线程池主要有两个作用:
1.控制线程数量(避免大量的线程导致系统崩溃)
2.重用线程(避免频繁创建销毁线程)
线程池的概念:首先呢创建一些线程,它们的集合称之为线程池,当服务器接收到一个客户请求后,就从线程池中取出一个空闲的线程为之服务,服务完了后不关闭线程,而是将该线程还回线程池中。
在线程池的编程模式下,任务是提交给整个线程池,而不是直接交给某个线程,线程池在拿到任务后,它就在内部找有无空闲的线程,再把任务交给内部某个空闲的线程,
一个线程只能执行一个任务,但我们可以同时向一个线程池提交多个任务
实现:ExecutorService接口
线程池对象的创建:
Executors.newFixedThreadPool(int nThreads):ExecutorService
将任务提交给线程池
Execute(Runnable)
public class ThreadPoolDemo {
public static void main(String[] args) {
//创建线程池对象
ExecutorService service =
Executors.newFixedThreadPool(3);
//将任务提交给线程池
for(int i=0;i<5;i++){
Task task = new Task();
service.execute(task);
}
//关闭线程池
//service.shutdown();
List<Runnable> list = service.shutdownNow();
System.out.println(list.size());
}
}
class Task implements Runnable{
@Override
public void run() {
String name = Thread.currentThread().getName();
System.out.println(name+"开始执行任务。。。");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name+"结束任务执行!");
}
}