"
问题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, 对于一些基础知识不是很理解,望不吝赐教!谢谢
"
"
1、Executors.newFixedThreadPool(nThreads ):IllegalArgumentException - if nThreads <= 0
2、final
指的是你的线程池地址不会变化,但是线程池里的线程没有限制。
Executors.newFixedThreadPool(i)
此处的i
取值范围不对吧,如果你出现IllegalArgumentException
,说明这个值是小于0
的,这是不允许的。
Executors.newFixedThreadPool(i)
最终会走下如下逻辑。
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
if (corePoolSize < 0 ||
maximumPoolSize <= 0 ||
maximumPoolSize < corePoolSize ||
keepAliveTime < 0)
throw new IllegalArgumentException();
if (workQueue == null || threadFactory == null || handler == null)
throw new NullPointerException();
this.corePoolSize = corePoolSize;
this.maximumPoolSize = maximumPoolSize;
this.workQueue = workQueue;
this.keepAliveTime = unit.toNanos(keepAliveTime);
this.threadFactory = threadFactory;
this.handler = handler;
}
"版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。