0

我对多线程很陌生,并尝试过应用它,但我有点卡住了。

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

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

所以我写了下面的代码:

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();

但是,我被困在这里。

首先,它希望 myqueryList是最终的。

每次在同一个变量中加载新的更新数据时,我都无法使其成为最终结果。

第二,

即使在让我的程序运行多线程之后,我的运行时间也没有任何改善。

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

4

1 回答 1

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。

更新:

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

    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();
    }
于 2012-12-07T11:15:21.847 回答