线程池的参数是有讲究的,乱输入一通是会出异常的。带你了解不规范操作,可能会出现哪些异常。
一.线程池的7个参数
1、corePoolSize线程池的核心线程数 2、maximumPoolSize能容纳的最大线程数 3、keepAliveTime空闲线程存活时间 4、unit 存活的时间单位 5、workQueue 存放提交但未执行任务的队列 6、threadFactory 创建线程的工厂类 7、handler 等待队列满后的拒绝策略
二.测试实验
1.创建TaskWithResult.java
public class TaskWithResult implements Callable<String> {
private int id ;
public TaskWithResult(int id) {
this.id = id;
}
/**
* 带返回值
* @return
* @throws Exception
*/
@Override
public String call(){
return "result of TaskWithResult " + id ;
}
}
2.创建CallableDemo.java
public class CallableDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//线程池
ExecutorService exec= new ThreadPoolExecutor(2, 5, 1L,
TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>(10),
Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
//任务
ArrayList<Future<String>> results = new ArrayList<>();
//提交任务
for(int i = 0;i < 10 ;i++){
results.add(exec.submit(new TaskWithResult(i)));
}
//阻塞获取结果
for(Future<String> res : results){
System.out.println(res.get());
}
//关闭线程池
exec.shutdown();
}
}
上述是正常运行的情况,我们改变一下参数便能实验出各种异常。我们先看一下源码里面是如何介绍这个构造器的。
源码里面说明了构造器不规范会抛出IllegalArgumentException或者NullPointerException
我们实验看一下,修改内容为:
ExecutorService exec= new ThreadPoolExecutor(-1, 5, 1L,
TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>(10),
Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
跑程序看一下,果然出现异常 再修改一下测试一下空指针的情况
ExecutorService exec= new ThreadPoolExecutor(2, 5, 1L,
TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>(10),
Executors.defaultThreadFactory(),null);
结果也是符合我们预期的 我改动了workQueue里面的长度,出现了另外一个异常,改动如下
ExecutorService exec= new ThreadPoolExecutor(2, 5, 1L,
TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>(4),
Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());
其它异常情况可以自行尝试,本文到这里就结束了,感谢阅读。
每天进步一点点,开心也多一点点
|