【发布时间】:2013-11-03 23:52:27
【问题描述】:
我有以下代码 sn-p,我想知道在线程池上运行任务时,在循环中提交 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();
}
}
}
}
}
【问题讨论】:
-
这个问题似乎是题外话,因为它是关于审查(可能是有效的)代码。请在codereview.stackexchange.com上提问
-
@Bohemian 这个问题完全是主题,我不需要发布我的确切对象。我只是问用可运行对象循环 ExecutorService 是否是一种好习惯。我在我当前的代码中使用这个循环,但担心问题。
-
如果可能的话,在 run() 方法中编写循环显然会更好。将 ExecutorService 用作 ersatz 'for' 循环肯定不是好习惯。
-
@EJP 这就是我认为我的问题所在,我需要对 importTask 进行多线程处理,这就是将其保留在 exec 服务之外的原因。将它放在 run 方法中不会使我能够对 importtask 进行多线程处理,还有其他建议吗?
-
这家伙似乎也有类似的问题,stackoverflow.com/questions/12845881/… 我不应该使用 Runnable 吗?我不知道没有它我可以创建新线程。
标签: java multithreading threadpool