线程池[前言]:
- 线程是宝贵的内存资源,单个线程约占1MB空间,过多分配易造成内存溢出。
- 频繁的创建以及销毁线程会增加虚拟机回收频率,资源开销,造成程序性能下降。
线程池[概念]:
- 线程容器,可设定线程分配的数量上限。
- 将预先创建的线程对象存入线程池中,并重用线程池中的 线程对象。
- 避免频繁的创建和销毁。
------ 创建线程池------
- 常用的线程池接口和类都在(java.uti1.concurrent)包里面:
- Executor: 线程池的顶级接口。
- ExecutorService:线程池接口,可以通过submit(Runnable task)提交任务代码。
- Executors:工具类:通过此类可以获取线程池(重点)。
以下通过Executors创建的线程池 | 说明 |
---|
newFixedThreadPool(int nThreads) | 获取固定数量的线程池。参数:指定线程池中线程的数量。 |
newCachedThreadPool() | 获得动态数量的线程池,线程数量由任务个数来决定的,没有上限。 |
newSingleThreadExecutor() | 创建单线程池 只有一个线程 |
newScheduledThreadPool() | 创建调度线程池 调度:周期,定时执行 |
| 根据下面代码分析 |
通用方法 | 说明 |
---|
es.submit(Runnable tas) | 提交任务 如:es.submit(runnable) |
es.shutdown() | 等待所有任务执行完毕,后关闭线程池 |
es.shutdownNow() | 不等待,停止所有正在执行的任务,暂停处理正在等待任务,并返回等待执行的任务列表 |
| 根据下面代码分析 |
package dey01;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Executors_01 {
public static void main(String[] args) {
ExecutorService es = Executors.newScheduledThreadPool(3);
Runnable runnable = new Runnable() {
private int t = 100;
@Override
public void run() {
while(true){
if (t<=0) {
break;
}
System.out.println(Thread.currentThread().getName()+"买了第"+t+"张票");
t--;
}
}
};
for (int i=0;i<4;i++) {
es.submit(runnable);
}
es.shutdown();
}
}
代码看不清楚可以看:
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/daa7536189c040c482c59b0c5e5078fa.png#pic_center)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/ef027434ce587647e7e16a75ae48058a.png#pic_center)
补充:
package dey02;
import java.util.Calendar;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Exe_03 {
public static void main(String[] args) {
ScheduledExecutorService es = Executors.newScheduledThreadPool(3);
es.schedule(new Runnable() {
@Override
public void run() {
System.out.println("时间1:" + Calendar.getInstance().getTime());
System.out.println(" - 爆炸");
}
}, 5, TimeUnit.SECONDS);
es.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out.print("时间2:"+Calendar.getInstance().getTime());
System.out.println(" - 爆炸");
}
}, 5,2, TimeUnit.SECONDS);
es.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
System.out.print("时间3:"+Calendar.getInstance().getTime());
System.out.println(" - 爆炸");
}
}, 15,3, TimeUnit.SECONDS);
}
}