介绍
线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。
线程池使用和多线程相关联。由于多线程的原理是消耗cup内存,来提高效率,线程过多时,会大量消耗内存的资源,即便是使用多线程来提高代码的执行效率,也要考虑内存等资源的压力,例如开启10000个复制文件的线程,那内存直接溢出,会影响其他的程序,多线程在提高效率的同时也要规范内存资源的使用,所以依赖于线程池
线程池:在执行开启线程之前, 先创建一个线程池,例如指定线程池最大线程为5,那么再由线程池去开启线程,这就保证了多线程,开启是有规定个数的,维护内存正常消耗;
常用的方法:
(1)通过Executors创建线程池
(2)execute():执行线程
(3)shutdown():停止线程
线程池的种类(4种)
(1).单个线程池:
newSingleThreadExecutor()
创建单个线程池
(2).定长线程池:
newFixedThreadPool(Integer)
规定多少个 可控制线程最大并发数,超出的线程会在队列中等待
(3).缓存线程池
newCachedThreadPool()
先查看池中有没有以前建立的线程,如果有,就直接使用
如果没有就建一个新的线程加入池中,缓存型池子通常用于执行一些生存期很短的异步型任务
(4).定时线程池
newScheduledThreadPool
new Runnable() 调用这个方法执行线程
executorService.schedule(Runnable,时间,时间单位);
固定时间之后,才执行任务;
例:
@Override
public void run() {
//当前时间 线程名
System.out.println(System.currentTimeMillis() +"—"+Thread.currentThread().getName());
}
//几秒执行线程 时间单元
},5, TimeUnit.SECONDS);
}
1:单个线程池
newSingleThreadExecutor
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* 单个线程池
*/
public class Demo implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
class testDemo{
public static void main(String[]args){
//创建单线程池
ExecutorService executorService = Executors.newSingleThreadExecutor();
for (int i = 0; i < 10; i++) {
executorService.execute(new Demo());
}
executorService.shutdown();//停止线程
}
}
效果图:
2:定长线程池
newFixedThreadPool
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**