栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

一文了解线程池创建的各种异常

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

一文了解线程池创建的各种异常

线程池的参数是有讲究的,乱输入一通是会出异常的。带你了解不规范操作,可能会出现哪些异常。

一.线程池的7个参数

1、corePoolSize线程池的核心线程数
2、maximumPoolSize能容纳的最大线程数
3、keepAliveTime空闲线程存活时间
4、unit 存活的时间单位
5、workQueue 存放提交但未执行任务的队列
6、threadFactory 创建线程的工厂类
7、handler 等待队列满后的拒绝策略

二.测试实验

1.创建TaskWithResult.java

public class TaskWithResult implements Callable {

    private int id ;

    public TaskWithResult(int id) {
        this.id = id;
    }

    
    @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> results = new ArrayList<>();
        //提交任务
        for(int i = 0;i < 10 ;i++){
            results.add(exec.submit(new TaskWithResult(i)));
        }
        //阻塞获取结果
        for(Future 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());

其它异常情况可以自行尝试,本文到这里就结束了,感谢阅读。

每天进步一点点,开心也多一点点

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/704189.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号