前提
线程池是什么:使用池化的技术来管理和使用线程
1、为什么要使用线程池
线程创建存在弊端
(1)线程的创建需要开辟内存资源,过多的创建会导致资源的浪费
(2)使用线程不能很好的管理任务和友好的拒绝任务
2、使用线程池创建线程的好处
降低资源消耗、
提高响应速度、
拥有更多的功能
提高线程的可管理性
3、线程池创建线程的方法
(1)创建固定个数的线程池
public class MyCode {
public static void main(String[] args) {//主方法
//创建固定个数为5的线程池
ExecutorService service = Executors.newFixedThreadPool(5);
//执行任务
service.execute(new Runnable() {
public void run() {//执行run()方法
System.out.println("线程名是:"+Thread.currentThread().getName());
}
});
}
}
(2)创建带缓存的线程池
public class MyCode {
public static void main(String[] args) {//主方法
//创建带缓存的线程池
ExecutorService service = Executors.newCachedThreadPool();
//执行10个任务
for (int i = 0; i < 10; i++) {
service.execute(new Runnable() {
public void run() {//执行run()方法
System.out.println("线程名是:"+Thread.currentThread().getName());
}
});
}
}
}
(3)创建可以执行定时任务的线程池
public class MyCode {
public static void main(String[] args) {//主方法
//创建可以执行定时任务的线程池
ScheduledExecutorService service = Executors.newScheduledThreadPool(5);
System.out.println("执行任务之前:"+new Date());
//执行任务
service.scheduleWithFixedDelay(new Runnable() {
public void run() {//执行run()方法
System.out.println("执行任务:"+new Date());
}
},1,3, TimeUnit.SECONDS);
//一秒后执行,每三秒执行一次
//需要参数 线程池的任务、延迟时间、执行频率、时间单位
}
}
//任务开始时间:以上次任务执行的结束时间作为下一次任务的开始时间
将方式三中的参数corePollSize从5改成1后,能创建单个可以执行定时任务的线程池
单个可以执行定时任务的线程池好处
无需频繁的创建和销毁线程
可以更好的分配、管理和存储任务
(4)创建单个线程的线程池
public class MyCode {
public static void main(String[] args) {//主方法
ExecutorService service = Executors.newSingleThreadScheduledExecutor();
//循环10次
for (int i = 0; i <10 ; i++) {
service.execute(new Runnable() {
public void run() {//执行run()方法
System.out.println("线程名是:"+Thread.currentThread().getName());
}
});
执行结果相同,说明为单线程
}
}