java.util.concurrent之FutureTask

jdk介绍:可取消的异步计算。利用开始和取消计算的方法、查询计算是否完成的方法和获取计算结果的方法,此类提供了对 Future 的基本实现。仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算。 

相当于新起一个线程去执行,不影响主线程其他代码执行,只不过获取线程结果时需要阻塞等待

代码如下:

package test;

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) {
		class Result {
			private String str;
		}
		ExecutorService executorService = Executors.newCachedThreadPool();
		final Result result = new Result();
		FutureTask futureTask = new FutureTask(new Runnable() {
			public void run() {
				try {
					System.out.println("线程" + Thread.currentThread().getName() + "开始执行");
					Thread.sleep((long) (Math.random() * 10000));
					result.str = "sdsd";
					System.out.println("线程" + Thread.currentThread().getName() + "执行完成");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}, result);

		try {
			System.out.println("准备开始执行子任务 ");
			executorService.execute(futureTask);
			Result r1 = futureTask.get();
			System.out.println("线程执行结果:" + r1.str);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
		executorService.shutdown();
	}
}

执行结果如下:

准备开始执行子任务 
线程pool-1-thread-1开始执行
线程pool-1-thread-1执行完成
线程执行结果:sdsd


你可能感兴趣的:(java多线程)