同步工具类二:可取消异步计算(java.util.concurrent.FutureTask)

FutureTask是一个可取消的异步计算(A cancellable asynchronous computation.)

FutureTask可处于等待运行、正在运行和运行完成这3种状态,运行完成包括所有可能的结束方式:正常结束、由于取消而结束和异常运行结束,FutureTask进入运行完成状态后,将永远处于该状态

示例一:FutureTask的简单示例调用FutureTask的run方法使其开始运行,也可将其封装至Thread中通过调用Thread的start方法间接调用FutureTask的run方法

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;


public final class MyFutureTask extends FutureTask {
	public MyFutureTask(Callable callable) {
		super(callable);
	}

	//当任务进入运行结束状态,无论是正常结束、取消任务还是异常结束
	//都将会调用该方法
	@Override
	protected void done() {
		if(this.isDone()){
			System.out.println("MyFutureTask is over!");
		}
	}
}
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;

public class Task{
	private MyFutureTask ft = new MyFutureTask(
			new Callable() {
				public Integer call() throws Exception {
					return new Integer(0);
				};
			}
	);
	private Thread t = new Thread(ft);
	
	public void run(){
		t.start();
	}
	
	public Integer get() throws InterruptedException, ExecutionException{
		//get()方法的运行方式取决于任务的状态
		//如果任务已经完成,则直接返回结果
		//如果任务正在运行中,则阻塞直到任务完成
		return ft.get();
	}
	
	public boolean cancel(){
		//尝试取消任务,如果任务处于运行结束状态或由于其它某些原因
		//无法取消,则尝试失败
		return ft.cancel(true);
	}
	
	public boolean isDone(){
		return ft.isDone();
	}
	
	public static void main(String[] args) 
			throws InterruptedException, ExecutionException {
		Task task = new Task();
		//如果运行任务时任务处于运行结束状态则会报线程状态异常:
		//java.lang.IllegalThreadStateException
		if(!task.isDone()){
			task.run();
		}
		Thread.sleep(1000);
		//此时任务已经完成,故取消失败
		System.out.println(task.cancel());
		System.out.println("result:" + task.get());
	}
}

运行结果如下:

MyFutureTask is over!
false
result:0

示例二:使用FutureTask实现的高效结果缓存

http://blog.csdn.net/a19881029/article/details/37602681

 

你可能感兴趣的:(Java,Multithreading)