1. 程式人生 > >如何在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()方法來判斷該任務的結果是否準備就緒。

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方法獲取執行緒執行後的結果。
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