ホームページ  >  記事  >  Java  >  Java では、スレッドの結果を取得するにはどうすればよいでしょうか?

Java では、スレッドの結果を取得するにはどうすればよいでしょうか?

WBOY
WBOY転載
2023-05-10 09:10:071357ブラウズ

1. コンセプト

Future は、完了していない可能性のある非同期タスクの結果を表します。この結果に対して、タスクの実行後に対応する操作を実行するコールバックを追加できます。成功するか失敗するか。

2. Future インターフェイス

Future インターフェイスは 5 つの主要なインターフェイス メソッドを定義しており、RunnableFuture と ScheduleFuture はこのインターフェイスを継承し、CompleteFuture と ForkJoinTask はこのインターフェイスを継承します。

3. 例

package test;
 
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
 
public class CallableFutureTest {
 
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
Callable<Integer> calculateCallable = new Callable<Integer>() {
@Override
public Integer call() throws Exception {
// TODO Auto-generated method stub
Thread.sleep(2000);//模拟耗时时间
int result = 1+2;
return result;
}
};
FutureTask<Integer> calculateFutureTask = new FutureTask<>(calculateCallable);
Thread t1 = new Thread(calculateFutureTask);
t1.start();
//现在加入Thread运行的是一个模拟远程调用耗时的服务,并且依赖他的计算结果(比如网络计算器)
try {
//模拟耗时任务,主线程做自己的事情,体现多线程的优势
Thread.sleep(3000);
int a = 3+5;
Integer result = calculateFutureTask.get();
System.out.println("result = "+(a+result));//模拟主线程依赖子线程的运行结果
long endTime = System.currentTimeMillis();
System.out.println("time = "+(endTime-startTime)+"ms");
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

上記からわかるように、約 3 秒かかりますが、実際には、主にメインスレッドのスリープに費やされる時間です。 (3000) Future を使用しない場合、スレッドの結果によっては、必要な時間は 5 秒 (サブスレッドで 2 秒、メインスレッドで 3 秒) になる可能性があります。

以上がJava では、スレッドの結果を取得するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。