1

リストを返すスレッドが必要です。戻り値の型が void であるため、run メソッドを使用できません。スレッドの呼び出し元メソッドもあるクラス内の別のプライベート メソッドでスレッドを使用しています。呼び出し元は、何らかの操作を行うために、スレッドの結果からのリストを必要とします。ここに私のスレッドがあります。Pls は、このスレッドからリストを返す方法を理解するのに役立ちます。

private List<myObject> fetchmyObjList(final String abc){
        new Thread(new Runnable() {

            @Override
            public void run() {

                try {
                    List<myObject> myObjList = anotherInternalMethod(abc);
                } catch (Exception e) {
                            System.out.println(e);

                    }
                }


        }).start();



    }

このスレッドが呼び出し元に myObjList を返すようにするにはどうすればよいですか?? 助けてください。

4

5 に答える 5

1

Runnable の代わりに callable を使用します。この関数は、Future の形式で値を返すことができます。これを利用して、自分の目的を達成することができます。

于 2013-10-08T10:31:50.390 に答える
0

次のようなメソッドを使用して、データを外部オブジェクト (fetchmyObjList を持つオブジェクトなど) にプッシュできます。

List<myObject> myObjList = anotherInternalMethod(abc);
setFetchedObjects(myObjList);

これは、新しく作成したスレッドに制御を入れるときのシナリオです。これを簡略化されたオブザーバー パターンと呼ぶことができます。データが利用可能になると、外側のオブジェクトはメソッド呼び出しによって通知されます。ただし、このシーンではスレッド セーフについて覚えておいてください。

他のシナリオはCallable<OBJECT YOU WANT TO RETURN>、Thread/ExecutorService を使用してタスクを開始することです。次に、(外部オブジェクトの制御で) Callable.get()を使用して結果を取得できます。ブロッキング メソッドまたはノンブロッキング メソッドを使用して、結果を待機したり、バックグラウンド タスクから結果を受け取る準備ができているかどうかを確認したりできます。

もちろん、シナリオでは、元のスレッドをブロックし、タスクの完了を待ってメソッドからオブジェクトを返すためだけに Callable を使用して Thread を作成しても、何も得られません。スレッドをまったく使用しない方がよいでしょう。バックグラウンド操作を実行する場合は、メソッド シグネチャを変更して、null を返す + データの準備ができたときに「リスナー」メソッドを呼び出すCallable<List<myObject>>か、他の操作が並行して実行された後に a を返し、そこからデータを取得します。

于 2013-10-08T10:26:44.660 に答える
0

自分のしていることを再考する必要があります。新しいスレッドは古いスレッドと並行して実行され、呼び出し元のスレッドがさらに多くの作業を完了するまで、応答の準備ができていない可能性があります。呼び出し元のスレッドを待機させることもできますが、メイン スレッドから単に「anotherInternalMethod」を呼び出さないのはなぜでしょうか?

次のようなことができます (ただし、しないでください!):

private void fetchmyObjList(final String abc, final List<myObject>[] retList)  {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                retList = anotherInternalMethod(abc);
            } catch (Exception e) {
                        System.out.println(e);
                }
            }
    }).start();
}

ただし、渡された retList オブジェクト (1 要素の配列) は、将来の予測できない時点まで正しく設定されません。

于 2013-10-08T18:46:54.217 に答える