0

私はマルチスレッドにかなり慣れておらず、それを適用するために何かを試みましたが、私はちょっと立ち往生しています。

シナリオは次のとおりです。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が最終的なものになることを期待しています。

新しい更新されたデータが同じ変数にロードされるたびに、それを最終的なcozにすることはできません。

第二に、

プログラムをマルチスレッドで実行した後でも、実行時間の改善はありません。

誰かが私がどこで間違っているのか教えてもらえますか?

4

1 に答える 1

0

'main'の代わりにカスタムスレッドを使用するだけなので、改善はありません。あなたの例には「マルチ」スレッドはありません。

速度の向上を確認したい場合は、複数のスレッドを同時に実行する必要があります。並行タスク処理にある種のスレッドプールを使用すると、改善が得られます。

また、匿名クラス--Runnableを作成しているため、変数はfinalである必要があります。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をシャットダウンして、すべてのタスクが完了するまで待つことができます。その後、新しいタスクを追加することはできません。

    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 に答える