我有下面的代码片段,我想知道如果在循环中提交Runnable
的实例是在线程池上运行任务的好习惯。将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();
}
}
}
}
}
这个问题似乎是题外话题,因为它是关于审查(推测工作)的代码。请在http://codereview.stackexchange.com上提问 – Bohemian
@Bohemian这个问题是完全关于主题,我没有必要发布我的确切对象。我只是问,如果循环使用可运行的ExecutorService是一种好的做法。我在当前的代码中使用这个循环,但担心问题。 –
如果可能的话,在run()方法内部编写循环显然会更好。使用ExecutorService作为* ersatz *'for'循环肯定不是好习惯。 – EJP