一、滥用线程的弊端
1、创建和销毁一个线程需要耗费资源和时间,有时候得不偿失;
2、线程本事占用内存,线程过多可能会内存溢出,JVM的GC也会增加压力,延长了GC的停顿时间。
二、线程池是什么
线程池类似于数据库连接池,你用的时候去拿,不用的时候还给线程池,这样可以减少线程的创建和销毁。
三、直接上菜
1、创建固定大小的线程池
package com.yarm.test;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
*
* @ClassName: FixedThreadPoolDemo
* @Description: 创建固定大小的线程池
* @Company:小松鼠课堂
* @author yarm_杨松
* @date 2018年7月22日 上午10:43:32
*/
public class FixedThreadPoolDemo {
// 内部类
public static class MyTask implements Runnable{
@Override
public void run() {
System.err.println("当前线程执行的时间戳:" + System.currentTimeMillis()
+ ",Thread ID:" + Thread.currentThread().getId());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//主函数
public static void main(String[] args) {
MyTask myTask = new MyTask();
//创建一个固定的线程池 5个
ExecutorService es = Executors.newFixedThreadPool(5);
//执行10次线程
for (int i = 0; i < 10; i++) {
es.submit(myTask);
}
}
}
控制台输出:
当前线程执行的时间戳:1532228378006,Thread ID:11
当前线程执行的时间戳:1532228378007,Thread ID:13
当前线程执行的时间戳:1532228378007,Thread ID:10
当前线程执行的时间戳:1532228378007,Thread ID:14
当前线程执行的时间戳:1532228378007,Thread ID:12
当前线程执行的时间戳:1532228381008,Thread ID:12
当前线程执行的时间戳:1532228381008,Thread ID:11
当前线程执行的时间戳:1532228381008,Thread ID:13
当前线程执行的时间戳:1532228381009,Thread ID:14
当前线程执行的时间戳:1532228381009,Thread ID:10
固定线程池实验结果分析:
由上述结果可知,线程池是5个,启动10个线程,线程分成两拨执行,一次执行5个。