私はJavaのスレッドに比較的慣れていません。以下が可能かどうか疑問に思っていました。
- スレッド [a] が (別のオブジェクトから) 呼び出されます。
- いくつかのことを行い、同じオブジェクトで別のスレッド [b] を開始します。
- その後、一時停止し、他のスレッドが終了するのを待ちます。
- 終了すると、作業中の結果を一時停止したスレッド [a] に渡し、スレッドを再開します。
- スレッド [a] は、それを呼び出した元のオブジェクトに結果を返します。
ありがとう!
私はJavaのスレッドに比較的慣れていません。以下が可能かどうか疑問に思っていました。
ありがとう!
これを行うには多くの方法があります。
次の例は、通常、タスクを実行するための最良の方法です。メインスレッドで何らかの作業を行い、別のスレッドで何らかの作業をCallable
行う anにa を渡します。ExecutorService
への呼び出しfuture.get
は、2 番目のスレッドが完了するまでブロックされ、 が返すObject
をCallable
返します。
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
はデフォルトで非デーモン スレッドを使用するため、アプリケーションはシャットダウンされるまで終了しないことに注意してください。
Java のスレッドで生活を楽にしたい場合は、wait()、notify() を使用しないでください。同期されたメソッドとステートメントを使用する必要があります。私の提案は、メインスレッドから渡される ReentrantLock と Condition を使用することです。二次スレッド
スレッドaが待機しているSynchronousQueuetake()
とスレッドbsput()
の結果はどうですか?
同期キューは、CSPおよびAdaで使用されるランデブーチャネルに似ています。これらは、あるスレッドで実行されているオブジェクトを別のスレッドで実行されているオブジェクトと同期して、情報、イベント、またはタスクを渡す必要があるハンドオフ設計に適しています。
タイムアウトを追加する場合はpoll()
、結果をスレッドaに、スレッドboffer()
にスレッドを設定します。
あなたが探しているのは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();
}
}
}