一、概述
1、系统启动一个新的线程成本比较高,因为它涉及与OS交互;尤其是程序中需要大量生存期很短的线程时,更应该需要使用线程池;
2、线程池在系统启动时创建大量的空闲线程,程序将一个Runnable对象传递给线程池,线程池会启动一条线程来执行该Runnable对象的run方法;
当run方法结束后,该线程不会死亡,而是再次回到线程池中处于空闲状态,等待执行下一个Runnable对象的run方法;
3、使用线程池也可以有效地控制系统中并发线程的数量;
4、JDK1.5之前,开发者需要自己手动实现线程池;
JDK1.5之后,Java内建支持线程池;
5、JDK1.5后,Java提供了Executors工厂类来生产线程池:
前3个方法将返回一个ExecutorService对象,该对象代表一个线程池,可以执行Runnable对象、Callable对象代表的线程;
6、当一个线程池使用完后,必须调用shutdown(),启动该线程池的关闭序列,不再接受新任务,将之前已提交的任务执行完成;
7、使用线程池开启线程:
7.1 使用Executors类创建一个ExecutorService对象;
7.2 创建Runnable接口实现类或Callable实现类;
7.3 调用ExecutorService对象的submit来提交Runnable实现类实例或Callable实现类实例;
7.4 关闭线程池;
package com.an; import java.util.concurrent.*; public class ThreadPoolTest { /** * Runnable实现类 */ static class RunnableImpl implements Runnable{ public void run() { System.out.println(Thread.currentThread().getName()); } } /** * Callable实现类 */ static class CallableImpl implements Callable{ public Object call() throws Exception { return Thread.currentThread().getName(); } } public static void main(String[] args)throws Exception{ ExecutorService executorService =Executors.newFixedThreadPool(3); executorService.submit(new RunnableImpl()); Future future =executorService.submit(new CallableImpl()); System.out.println(future.get()); executorService.shutdown(); } }