一、背景
经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。
如果我们提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毁、实现重复利用。
线程池实现图示:
二、线程池方法
JDK5.0起提供了线程池相关API:ExecutorService和Executors
- ExecutorService:线程池接口。
1、void execute(Runnable command):执行任务/命令,没有返回指,一般用来执行Runnable
2、 Future submit(Callable task):执行任务,有返回指,一般用来执行Callable
3、void shudown():关闭连接池
-
Executors:工具类、线程池的工厂类,用于创建并返回不同类型的线程池。
ExecutorService newFixedThreadPool(int nThreads):创建一个指定线程数的线程池
三、代码示例
- Runnable接口的线程:
public class ThreadDemo5 {
public static void main(String[] args) {
// 创建线程池
ExecutorService es = Executors.newFixedThreadPool(10);
// 执行
es.execute(new T1());
es.execute(new T1());
es.execute(new T1());
// 关闭线程池
es.shutdown();
}
}
class T1 implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
输出:
- Callable接口的线程:
public class ThreadDemo6 {
public static void main(String[] args) {
// 创建线程池
ExecutorService es = Executors.newFixedThreadPool(10);
// 执行
es.submit(new T2());
es.submit(new T2());
es.submit(new T2());
// 关闭线程池
es.shutdown();
}
}
class T2 implements Callable<Boolean> {
@Override
public Boolean call() {
System.out.println(Thread.currentThread().getName());
return true;
}
}
输出结果是一样的,都成功启动了3个线程。