當前位置:編程學習大全網 - 源碼下載 - 如何在java中獲取線程異步執行之後的結果

如何在java中獲取線程異步執行之後的結果

java中提供了Future<V>接口和實現了Future接口的FutureTask<V> 類來將線程執行之後的結果返回(通過get()方法)。

1.Future<V>接口

Runnable接口執行任務是不返回任何值的,Runnable的run()方法的執行結果是void,而Future接口的call方法是有返回結果的,這是Runnable跟Future的區別之壹,它們的另壹個不同之處就是實現了Runnable接口的任務執行是調用ExecutorService的execute(Runnable task)方法,而實現了Future接口的任務是調用ExecutorService的submit(Future task)方法。調用Future的get()方法就能直接得到任務的返回值,該方法會壹直阻塞直到任務的結果出來為止,我們可以調用Future的isDone()方法來判斷該任務的結果是否準備就緒。

[java] view plain copy

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Future;

public class TestFuture {

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

ExecutorService executor = Executors.newCachedThreadPool();

Future result1 = executor.submit(new Callable() {

@Override

public Integer call() throws Exception {

int sum = 0;

for (int i = 0; i < 10; i++) {

sum += i;

}

return sum;

}

});

Future result2 = executor.submit(new Callable() {

@Override

public Integer call() throws Exception {

int sum = 0;

for (int i = 10; i < 100; i++) {

sum += i;

}

return sum;

}

});

executor.shutdown();

System.out.println(result1.get() + result2.get());

}

}

2.FutureTask類

FutureTask實現了Future接口,將壹個Callable實例作為參數傳給它,就能創建壹個FutureTask實例,然後用ExecutorService的submit方法來執行這個實例。最後同樣是用get方法獲取線程執行後的結果。

[plain] view plain copy

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.FutureTask;

public class TestFutureTask {

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

ExecutorService executor = Executors.newCachedThreadPool();

Callable task = new Callable() {

@Override

public String call() throws Exception {

return "結果";

}

};

FutureTask ft = new FutureTask(task);

executor.submit(ft);

System.out.println(ft.get());

executor.shutdown();

}

}empty

  • 上一篇:誰知道手機Android文件夾裏哪些是沒用的啊,占內存太大了
  • 下一篇:壹汽大眾汽車電動車時速表壞了怎麽修理?
  • copyright 2024編程學習大全網