2012-12-07 10 views
0

我对多线程相当陌生并尝试过应用它,但我有点卡住了。java中的multithreaing - drools和数据库

这里是场景: 使用drools将规则应用于从db读取的一组对象,然后将更新后的值写回db。

现在,我重复上述过程多次,所以我想运行的读数+在一个线程(主线程),并在另一写入的部分流口水的过程。

所以我写了下面的代码:

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

你只需要使用您的自定义主题,而不是“主”,所以没有改良效果。您的示例中没有“多线程”线程。

如果你想看到的速度改良效果,你应该同时放跑几线程。 使用某种线程池进行并发任务处理,然后您将获得改进。

此外,变量必须是最后的,因为你正在创建匿名类 - 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(); 
     } 
    } 
} 

用法:

final ExecutorService threadPool = Executors.newCachedThreadPool(); 
threadPool.submit(new QueryTask(queryList.subList(0, 5))); 
threadPool.submit(new QueryTask(queryList.subList(6, 10))); 

这将处理由部分您queryList兼任。

UPDATE:

当你已经提交所有的任务,你可以关闭线程池,并等待所有任务将完成。 之后您不能添加任何新任务。

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(); 
    } 
+0

所以,如果我把queryList作为final,那么我如何用下一个周期发布的新数据填充它? – ItachiUchiha

+0

感谢您的快速回复! 但lemme解释我的情况多一点.. 我有一个列表发送到数据库和数据地图列表读取,现在因为这个数据非常大,我必须将这个读取过程分成部分(以避免溢出),在每个部分我应用规则和一些数据被更新,并且这个数据将被更新到数据库。 现在,我的申请规则和更新db需要最长的时间,所以我正在考虑平行运行这两个步骤! – ItachiUchiha

+0

@abhinay您应该考虑如何在某些部分分离数据,然后创建可运行的任务,将数据部分传递给该任务并在threadPool中运行它们。您可以使固定的线程池,一次提交所有任务,并且不会溢出,因为同时只有固定数量的正在运行的任务。你可以使用这个创建固定的线程池大小:Executors.newFixedThreadPool(i) – kornero