我对多线程非常陌生并试图应用它,但我有点卡住了。
以下是该方案: 使用drools对从db读取的一组对象应用规则,然后将更新的值写回db。
现在,我多次重复上述过程,所以我想在一个线程(主线程)中运行读取+ drool进程,在另一个线程中运行写入部分。
所以我写下面的代码:
Thread thread = new Thread(new Runnable()
{ public void run()
{
try
{
//writing the updated data in DB
aggregationDAO.updateCaseDetailsInOracle(queryList);
}
catch (Exception e) { throw new RuntimeException();
}
}
});
thread.start();
但是,我被困在这里。
首先,它希望我的queryList
是最终的。
每当新的更新数据加载到同一个变量中时,我都无法做到最终。
其次,
即使我的程序运行多线程,我的运行时间也没有改善。
可以,有人告诉我哪里出错了吗?
答案 0 :(得分:0)
你只需使用自定义线程而不是'main',所以没有改进。您的示例中没有“多个”线程。
如果你想看速度提升,你应该同时运行几个线程。 使用某种线程池进行并发任务处理,然后你就会得到改进。
此外,变量必须是final,因为您正在创建匿名类 - Runnable。你应该创建一个新类,它将实现Runnable并将你的变量传递给构造函数。
class QueryTask implements Runnable {
private final List queryList;
public QueryTask(List queryList) {
this.queryList = queryList;
}
@Override
public void run() {
try { //writing the updated data in DB
aggregationDAO.updateCaseDetailsInOracle(queryList);
} catch (Exception e) {
throw new RuntimeException();
}
}
}
<强> USAGE:强>
final ExecutorService threadPool = Executors.newCachedThreadPool();
threadPool.submit(new QueryTask(queryList.subList(0, 5)));
threadPool.submit(new QueryTask(queryList.subList(6, 10)));
这将同时按部分处理您的queryList。
<强>更新强>
当您已经提交了所有任务时,可以关闭threadPool并等待所有任务完成。 之后您无法添加任何新任务。
threadPool.shutdown();
try {
threadPool.awaitTermination(10, TimeUnit.MINUTES);
} catch (InterruptedException e) {
// Current thread was interrupted.
final List<Runnable> runnables = threadPool.shutdownNow();
System.out.println("Can't stop tasks: " + runnables.size());
// Restore interrupted status.
Thread.currentThread().interrupt();
}