我有以下代码片段,我想知道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();
}
}
}
}
}