JDK四种线程池
// 创建一个不限线程数上限的线程池,任何提交的任务都将立即执行
Executors.newCachedThreadPool();
//创建固定大小的线程池
Executors.newFixedThreadPool(3);
// 定时执行的线程池
Executors.newScheduledThreadPool(3);
// 创建一个只有一个线程的线程池
Executors.newSingleThreadPool();
线程池创建的参数列表
工作顺序
corePoolSize -> 任务队列 -> maximumPoolSize -> 拒绝策略
常见的拒绝策略
拒绝策略 | 拒绝行为 |
---|---|
AbortPolicy | 抛出RejectedExecutionException,是线程池默认的策略 |
DiscardPolicy | 什么也不做,直接忽略 |
DiscardOldestPolicy | 丢弃执行队列中最老的任务,尝试为当前提交的任务腾出位置 |
CallerRunsPolicy | 直接由提交任务者执行这个任务 |
获取处理结果和异常
线程池的处理结果、以及处理过程中的异常都被包装到Future
中,并在调用Future.get()
方法时获取,执行过程中的异常会被包装成ExecutionException
,submit()
方法本身不会传递结果和任务执行过程中的异常。可以通过重写Callable中的call()方法来获取
ExecutorService executorService = Executors.newFixedThreadPool(4);
Future<Object> future = executorService.submit(new Callable<Object>() {
@Override
public Object call() throws Exception {
throw new RuntimeException("exception in call~");// 该异常会在调用Future.get()时传递给调用者
}
});
try {
Object result = future.get();
} catch (InterruptedException e) {
// interrupt
} catch (ExecutionException e) {
// exception in Callable.call()
e.printStackTrace();
}
Java中创建多线程方式有几种
实现方式有三种:Callable、Runnable、继承Thread类;
但是底层都是通过new Thread();
Callable和Runnable的区别
Callable允许有返回值,允许抛出异常,是在JDK1.5中加入的接口,对Runnable的一种补充