ThreadPool
原理
在jdk1.5之后提供的
java.util.concurrent
Class Executors:线程池的工厂类,用来生成线程池
Executors的静态方法
static ExecutorService newFixedThreadPool(int nThreads)
创建一个线程池,该线程池重用固定数量的从共享无界队列中运行的线程。
- 参数 int nThreads 创建线程池中包含的线程数量
- 返回值:ExecutorService是一个接口的实现类对象,我们可以使用ExecutorService接口接收(面向接口编程)
java.util.concurrent
Interface ExecutorService提供了一个方法:
用来从线程池中获取线程,调用start方法,执行线程任务
Future<?> submit(Runnable task)
提交一个可运行的任务执行,并返回一个表示该任务的未来。
关闭/销毁线程池的方法
void shutdown()
启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。
线程池的使用步骤 - 1.使用线程池的工厂类Executors里面提供的静态方法newFixedThreadPool(int nThreads)生产一个指定的线程数量的线程池
- 2.创建一个类,实现Runnable接口,重写run方法,设置线程任务
- 3.调用Executorservice中的方法sumbit,传递线程任务(实现类)开启线程,执行run方法
- 4.调用Executorservice的shutdown()方法销毁线程池(不建议执行)
创建一个类,实现Runnable接口,重写run方法,设置线程任务
代码:
public class RunnableImpl implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"创建了一个新的线程");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
测试代码:
public class Demo01ThreadPool {
public static void main(String[] args) {
//1.使用线程池的工厂类Executors里面提供的静态方法newFixedThreadPool(int nThreads)生产一个指定的线程数量的线程池
ExecutorService es = Executors.newFixedThreadPool(2);//为了更好的看清线程池的运行状态,在线程中调用sleep方法,使得每个线程执行超过5秒,不会立即释放线程资源
//3.调用Executorservice中的方法sumbit,传递线程任务(实现类)开启线程,执行run方法
es.submit(new RunnableImpl());//pool-1-thread-1创建了一个新的线程
//线程池会一直开启,使用完了线程,就会自动把线程归还给线程池,线程继续执行
es.submit(new RunnableImpl());//pool-1-thread-2创建了一个新的线程
es.submit(new RunnableImpl());//pool-1-thread-1创建了一个新的线程
es.submit(new RunnableImpl());//pool-1-thread-2创建了一个新的线程
//4.调用Executorservice的shutdown()方法销毁线程池(不建议执行)
/* es.shutdown();
es.submit(new RunnableImpl());//抛出异常了,原因线程池没了!*/
}
}