目录
一 线程池介绍
为什么会出现线程池?
我们使用线程的时候就会去创建线程,如果并发的线程数量很多,并且每个线程执行了一个时间很短的任务就结束了,
这样频繁地创建线程会降低系统的效率,因为频繁创建和销毁线程都需要时间.
那么有没有一种办法让线程可以复用(执行完一个任务,并不被销毁,可以执行下一个任务)?
答:可以通过线程池
线程池 就是容纳多个线程的容器,可以用集合,在JDK1.5之后,就内置了线程池,非常方便
线程池的好处:
1 降低资源消耗
2 提高响应速度
3 提高线程的可管理性
线程池工作原理
二 线程池使用
2.1 使用步骤
1 使用线程池的工厂类 Executors 的静态方法 newFixedThreadPool 生产一个指定数量的线程池(返回ExecutorService类型)
2 创建一个类,实现 Runnable 接口,重写run()方法,设置线程任务
3 调用ExecutorService的submit()方法,传递线程实体类 → 开启线程,执行run()方法
4 可以 调用ExecutorService的shutdown()方法,销毁线程池 (不建议使用)
2.2 代码
package threadChi;
//2 创建一个类,实现 Runnable 接口,重写run()方法,设置线程任务
public class MyThreadImpl implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"被创建出来了");
}
}
package threadChi;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ThreadPoolTest {
public static void main(String[] args) {
//1 使用线程池的工厂类 Executors 的静态方法 newFixedThreadPool 生产一个指定数量的线程池
ExecutorService es = Executors.newFixedThreadPool(4);
//3 调用ExecutorService的submit()方法,传递线程实体类 → 开启线程,执行run()方法
es.submit(new MyThreadImpl());
es.submit(new MyThreadImpl());
es.submit(new MyThreadImpl());
//4 可以 调用ExecutorService的shutdown()方法,销毁线程池 (不建议使用)
es.shutdown();
es.submit(new MyThreadImpl());
}
}
效果:
线程池创建了3个线程
shutdown()方法销毁了线程池,线程池被销毁了,就不能再开启新线程了