6

私はJavaプログラミングに不慣れです。2つのdbクエリを並行して実行する必要があるユースケースがあります。私のクラスの構造は次のようなものです。

class A {
    public Object func_1() {
        //executes db query1
    }

    public Object func_2() {
        //executes db query1
    }
}

これで、同じクラスに別の関数func_3を追加しました。この関数は、これら2つの関数を呼び出しますが、それらが並列に実行されることも確認します。このために、私はcallablesとfuturesを利用しています。このように使用するのは正しい方法ですか?この変数を一時変数に格納し、これを使用してfunc_3からfunc_1とfunc_2を呼び出します(これが正しいアプローチかどうかはわかりません)。または、このようなケースを処理する他の方法はありますか?

class A {
    public Object func_1() {
        //executes db query1
    }

    public Object func_2() {
        //executes db query1
    }

    public void func_3() {
        final A that = this;
        Callable call1 = new Callable() {
            @Override
            public Object call() {
               return that.func_1();
            }
        }

        Callable call2 = new Callable() {
            @Override
            public Object call() {
               return that.func_2();
            }
        }
        ArrayList<Callable<Object>> list = new ArrayList<Callable<Object>>();
        list.add(call1);
        list.add(call2);
        ExecutorService executor = Executors.newFixedThreadPool(2);
        ArrayList<Future<Object>> futureList = new ArrayList<Future<Object>>();
        futureList = (ArrayList<Future<Object>>) executor.invokeAll(list);
        //process result accordingly
    }
}
4

2 に答える 2

5

func_1()まず第一に、これを別のローカル変数に格納する必要はありません。外部関数はfunc_2()this単にA.this.

第二に、はい、それは一般的な方法です。また、func_3 を頻繁に呼び出す場合は、固定スレッド プールの作成を避け、スレッドの作成はかなり「コストがかかる」ため、params として渡す必要があります。

于 2012-12-27T17:10:50.743 に答える
0

Executor(Service) の全体的な考え方は、多くの小さなタスクに少数のスレッドを使用することです。ここでは、2 つのタスクに 2 スレッドのエグゼキューターを使用します。グローバルに定義されたエグゼキューターを作成するか、2 つのタスクに対して 2 つのスレッドを生成するだけです。

于 2012-12-27T17:53:20.703 に答える