线程池处理任务
ExecutorService的常用方法
方法名称 | 说明 |
---|---|
void execute(Runnable command) | 执行 Runnable 任务 |
Future< T > submit(Callable< T > task) | 执行 Callable 任务,返回未来任务对象,用于获取线程返回的结果 |
void shutdown() | 等全部任务执行完毕后,再关闭线程池! |
List< Runnable > shutdownNow() | 立刻关闭线程池,停止正在执行的任务,并返回队列中未执行的任务 |
1.线程池处理Runnable任务
public class Demo {public static void main(String[] args) {//创建线程池对象ThreadPoolExecutor pool = new ThreadPoolExecutor(3,5,30,TimeUnit.SECONDS,new ArrayBlockingQueue<>(4),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy() //默认拒绝策略:任务,抛出异常);//public void execute(Runnable command) 执行Runnable任务pool.execute(new MyRunnable()); //核心pool.execute(new MyRunnable()); //核心pool.execute(new MyRunnable()); //核心pool.execute(new MyRunnable()); //任务队列pool.execute(new MyRunnable()); //任务队列pool.execute(new MyRunnable()); //任务队列pool.execute(new MyRunnable()); //任务队列pool.execute(new MyRunnable()); //临时线程pool.execute(new MyRunnable()); //临时线程//pool.execute(new MyRunnable()); //被拒绝了//public void shutdown(); 等全部任务执行完毕后,关闭线程池pool.shutdown();}
}
class MyRunnable implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "执行了");}
}
通过execute方法向线程池中提交Runnable任务时,流程如下:
客户端每提交一个任务,线程池就会在核心线程池中创建一个工作线程来执行这个任务,当核心线程中的线程已满时,就会将任务存储到任务队列中,等待核心线程池中的空闲线程来执行,如果任务队列满了线程会在工厂创建临时线程来执行任务,直到当前线程池总线程数量超过最大线程数时就会执行拒绝策略
2.线程池处理Callable任务
public class Demo {public static void main(String[] args) throws ExecutionException, InterruptedException {ThreadPoolExecutor pool = new ThreadPoolExecutor(3,5,30,TimeUnit.SECONDS,new ArrayBlockingQueue<>(5),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());//public Future<T> submit(Callable<T> task); 执行Callable任务,返回未来任务对象,用来获取线程完毕返回的结果Future<Integer> ft1 = pool.submit(new MyCallable(10)); Future<Integer> ft2 = pool.submit(new MyCallable(50)); Future<Integer> ft3 = pool.submit(new MyCallable(100)); System.out.println(ft1.get()); //55System.out.println(ft2.get()); //1275System.out.println(ft3.get()); //5050pool.shutdown();}
}//求1到n的整数和,并返回结果
class MyCallable implements Callable<Integer>{//通过带参构造,注入一些数据private int n;public MyCallable() {}public MyCallable(int n){this.n = n;}@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 1; i <= n ; i++) {sum += i;}return sum;}
}
通过submit方法向线程池中提交Callable任务时,流程如下:
客户端每提交一个任务,线程池就会在核心线程池中创建一个工作线程来执行这个任务,当核心线程中的线程已满时,就会将任务存储到任务队列中,等待核心线程池中的空闲线程来执行,如果任务队列满了线程会在工厂创建临时线程来执行任务,直到当前线程池总线程数量超过最大线程数时就会执行拒绝策略