线程池使用有点: 提供一个线程队列,队列中保存所有;
如下代码有两种方式:Runable 和 Callable
使用步骤:step1:创建一个线程池(5种) step2:分配任务pool.submit(tpd) step3:关闭线程池 pool.shutdown();
package com.pccc.pactera.juc01;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* 线程池: 提供一个线程队列,队列中保存所有等待状态的线程,避免了创建与销毁额外开销,提高了相应速度
*
* 线程池的体系结构 java.util.concurrent.Executor :负责线程的使用与调度的根接口 --ExecutorService
* 子接口:线程池的主要接口 --ThreadPoolExecutor 线程池的实现类 --ScheduledExecutorService
* 子接口:负责线程调度 --ScheduledThreadPoolExecutor
* 继承ThreadPoolExecutor,实现了ScheduledExecutorService 工具类 Executor
*
* ScheduledExecutorService newScheduledThreadPool()创建固定大小的线程,可以延迟或定时的执行任务
*
* @author zhao
*
*/
public class TestThreadPool {
public static void main(String[] args) throws Exception {
// 1创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(5);
// Callable的使用方式
List<Future<Integer>> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Future<Integer> future = pool.submit(new Callable<Integer>() {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 0; i < 100; i++) {
sum += i;
}
return sum;
}
});
list.add(future);
// System.out.println(future.get());
}
pool.shutdown();
for (Future<Integer> future : list) {// 获取结果
System.out.println(future.get());
}
/*
* runable方式: ThreadPoolDemo tpd = new ThreadPoolDemo();
*
* // 2为线程池中的线程分配任务 for (int i = 0; i < 10; i++) { pool.submit(tpd); }
*
* // 3关闭线程池 pool.shutdown();// 平和的方式,会等待线程池的所有任务完成后再关闭,不接受新任务 //
* pool.shutdownNow();// 直接关闭,不关系是否有正在执行的线程任务
*/
}
}
class ThreadPoolDemo implements Runnable {
private int i = 0;
@Override
public void run() {
while (i <= 100) {
System.out.println(Thread.currentThread().getName() + ": " + i++);
}
}
}
等待状态的线程,避免了创建与销毁额外开销,提高了相应速度