java – 在循环中将Runnable提交给线程池是一种好习惯吗?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 在循环中将Runnable提交给线程池是一种好习惯吗?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1534字,纯文字阅读大概需要3分钟。
内容图文
![java – 在循环中将Runnable提交给线程池是一种好习惯吗?](/upload/InfoBanner/zyjiaocheng/793/8b85bc6882644a67801c4a845c992e92.jpg)
我有以下代码片段,我想知道在线程池上运行任务时是否在循环中提交Runnable实例是一种很好的做法.
我需要访问循环外的列表,这是我的推理.这是伪代码,所以我的真实代码使用ConcurrentHashMap,消除了线程问题.如果这是不好的做法,有没有人有更好的建议?我尝试将其拆分为另一个类,但遇到了我的外部列表问题.
我知道何时清除内存列表时遇到麻烦,我无法知道线程何时全部完成.
public void startJob() {
int threads = Runtime.getRuntime().availableProcessors();
ExecutorService exec = Executors.newFixedThreadPool(threads);
final List<ImportTask> importTasks = session.createCriteria(ImportTask.class).list();
final List<Object> objs = new ArrayList<>();
int count = 0;
for (ImportTask importTask : importTasks) {
exec.submit(new Runnable() {
@Override
public void run() {
count++;
if(objs.contains(importTask) {
obj = objs.get(importTask.indexOf(importTask));
} else {
Object obj = new Object();
objs.add(obj);
session.save(obj);
}
if(count % 50 = 1000) {
session.flush();
session.commit();
}
}
}
}
}
解决方法:
将Runnable实例提交到线程池是实现任务并发执行的完美有效方法.
要知道每个任务何时完成,请保留ExecutionService.submit()返回的Future对象列表.
Future<?> future = exec.submit(new Runnable() {
...
futures.add(future);
最后使用阻塞Future.get()获取每个未来的结果.
正如另一个答案所示,您也可以使用ExecutorService.invokeAll().不同之处在于该方法仅采用Callable而不是Runnable,必须一次性提交所有任务,并且该方法等待直到最后一个任务终止.
使代码更整洁的另一个步骤是使您的任务(ImportTask)实现Callable接口(和调用方法)并返回它的计算.如果需要将值传递给任务,例如objs列表,则可以通过ImportTask的构造函数执行此操作.
内容总结
以上是互联网集市为您收集整理的java – 在循环中将Runnable提交给线程池是一种好习惯吗?全部内容,希望文章能够帮你解决java – 在循环中将Runnable提交给线程池是一种好习惯吗?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。