0

私はJavaのスレッドに比較的慣れていません。以下が可能かどうか疑問に思っていました。

  • スレッド [a] が (別のオブジェクトから) 呼び出されます。
  • いくつかのことを行い、同じオブジェクトで別のスレッド [b] を開始します。
  • その後、一時停止し、他のスレッドが終了するのを待ちます。
  • 終了すると、作業中の結果を一時停止したスレッド [a] に渡し、スレッドを再開します。
  • スレッド [a] は、それを呼び出した元のオブジェクトに結果を返します。

ありがとう!

4

4 に答える 4

2

これを行うには多くの方法があります。

次の例は、通常、タスクを実行するための最良の方法です。メインスレッドで何らかの作業を行い、別のスレッドで何らかの作業をCallable行う anにa を渡します。ExecutorServiceへの呼び出しfuture.getは、2 番目のスレッドが完了するまでブロックされ、 が返すObjectCallable返します。

private static final ExecutorService executorService = Executors.newFixedThreadPool(1);

public static void main(String[] args) {
    //do some stuff       
    final Future<Object> future = executorService.submit(new MyOtherWork());
    final Object object;
    try {
        object = future.get();
    } catch (InterruptedException ex) {
        Thread.currentThread().interrupt();
    } catch (ExecutionException ex) {
        //handle exception
    }       
    //do some other stuff

}

private static class MyOtherWork implements Callable<Object> {

    public Object call() throws Exception {
        //do stuff in another thread
    }
}

ExecutorServiceはデフォルトで非デーモン スレッドを使用するため、アプリケーションはシャットダウンされるまで終了しないことに注意してください。

于 2013-03-09T15:51:04.847 に答える
1

Java のスレッドで生活を楽にしたい場合は、wait()、notify() を使用しないでください。同期されたメソッドとステートメントを使用する必要があります。私の提案は、メインスレッドから渡される ReentrantLock と Condition を使用することです。二次スレッド

ここで詳細を読むことができます

于 2013-03-09T15:40:36.793 に答える
0

スレッドaが待機しているSynchronousQueuetake()とスレッドbsput()の結果はどうですか?

同期キューは、CSPおよびAdaで使用されるランデブーチャネルに似ています。これらは、あるスレッドで実行されているオブジェクトを別のスレッドで実行されているオブジェクトと同期して、情報、イベント、またはタスクを渡す必要があるハンドオフ設計に適しています。

タイムアウトを追加する場合はpoll()、結果をスレッドaに、スレッドboffer()にスレッドを設定します。

于 2013-03-09T15:31:49.943 に答える
0

あなたが探しているのはjava.util.Callableとだと思いますjava.util.Executors

これは私が書くことができる最短のコードです:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestCallable {

    public static void main(String[] args) throws InterruptedException, ExecutionException {

        ExecutorService executor = Executors.newSingleThreadExecutor();
        try {
            Integer five = executor.submit(new Callable<Integer>() {

                @Override
                public Integer call() throws Exception {
                    ExecutorService executor = Executors.newSingleThreadExecutor();
                    try {
                        return executor.submit(new Callable<Integer>() {

                            @Override
                            public Integer call() throws Exception {
                                return 5;
                            }

                        }).get();
                    } finally {
                        executor.shutdown();
                    }
                }

            }).get();

            System.out.println(five); // prints 5

        } finally {
            executor.shutdown();
        }
    }
}
于 2013-03-09T16:17:44.583 に答える