java中的多重区分 - drools和数据库

时间:2012-12-07 10:40:53

标签: java multithreading

我对多线程非常陌生并试图应用它,但我有点卡住了。

以下是该方案: 使用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是最终的。

每当新的更新数据加载到同一个变量中时,我都无法做到最终。

其次,

即使我的程序运行多线程,我的运行时间也没有改善。

可以,有人告诉我哪里出错了吗?

1 个答案:

答案 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();
    }