Java中在子线程中获取固定大小的连接池出现错误,如果解释?

问题1. 不太好描述,直接看代码吧


public class QueueConsumer extends EndPoint implements Runnable {


    // 线程池

    private ExecutorService executor = null;


    public QueueConsumer(String endPointName, String hosts, String ports,

            String username, String password) throws Exception {

        super(endPointName, hosts, ports, username, password);

        // 初始化线程池

        executor = Executors.newCachedThreadPool();

    }


    @Override

    public void run() {

        try {

            QueueingConsumer consumer = new QueueingConsumer(channel);

            channel.basicConsume(endPointName, false, consumer);

            while (true) {


                // 信息到达时

                Delivery delivery = consumer.nextDelivery();

                

                // 初始化业务线程对象

                BusinessClient businessClient = new BusinessClient(channel, delivery);

                // 执行任务

                executor.execute(businessClient);

            }

        } catch (Exception e) {

            LogUtil.printException("消息队列异常", e, LogUtil.LOG_LEVEL_ERROR);

        } finally {

            try {

                close();

            } catch (Exception e) {

                LogUtil.printException("关闭消息队列异常", e, LogUtil.LOG_LEVEL_ERROR);


public class BusinessClient implements Runnable {

    ... 省略

    

    // 主要代码

    List<Callable<Object>> taskList = new ArrayList<Callable<Object>>();

    for (BaseRequestData<BaseResponseData> queryData : queryDataLst) {

        QueryThread queryThread = new QueryThread(queryData);

        taskList.add(queryThread);

    }


    // 问题点:此处使用Executors.newFixedThreadPool(i)会抛出IllegalArgumentException

              但是使用Executors.newCachedThreadPool()则不会有问题.不是很理解,为什么此处不可以用newFixedThreadPool(i)?

              

    ExecutorService executor = Executors.newCachedThreadPool();

    List<Future<Object>> results = executor.invokeAll(taskList);

    executor.shutdown();

    

    ... 省略

}

问题2. 我如果定义一个线程池工厂,将线程池定义为static final,每个需要并发的地方都使用工厂来获得线程池,


   那么问题来了,我这个线程池会自动扩展或者释放线程吗?

   

   

纯粹自学的Java, 对于一些基础知识不是很理解,望不吝赐教!谢谢


慕姐8265434
浏览 498回答 2
2回答

大话西游666

Executors.newFixedThreadPool(i) 此处的i取值范围不对吧,如果你出现IllegalArgumentException,说明这个值是小于0的,这是不允许的。Executors.newFixedThreadPool(i) 最终会走下如下逻辑。public ThreadPoolExecutor(int corePoolSize,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int maximumPoolSize,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; long keepAliveTime,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TimeUnit unit,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BlockingQueue<Runnable> workQueue,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ThreadFactory threadFactory,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RejectedExecutionHandler handler) {&nbsp; &nbsp; if (corePoolSize < 0 ||&nbsp; &nbsp; &nbsp; &nbsp; maximumPoolSize <= 0 ||&nbsp; &nbsp; &nbsp; &nbsp; maximumPoolSize < corePoolSize ||&nbsp; &nbsp; &nbsp; &nbsp; keepAliveTime < 0)&nbsp; &nbsp; &nbsp; &nbsp; throw new IllegalArgumentException();&nbsp; &nbsp; if (workQueue == null || threadFactory == null || handler == null)&nbsp; &nbsp; &nbsp; &nbsp; throw new NullPointerException();&nbsp; &nbsp; this.corePoolSize = corePoolSize;&nbsp; &nbsp; this.maximumPoolSize = maximumPoolSize;&nbsp; &nbsp; this.workQueue = workQueue;&nbsp; &nbsp; this.keepAliveTime = unit.toNanos(keepAliveTime);&nbsp; &nbsp; this.threadFactory = threadFactory;&nbsp; &nbsp; this.handler = handler;}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java