`
buzhucele
  • 浏览: 328097 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java同步例子之FutureTask

    博客分类:
  • java
阅读更多
仅在计算完成时才能获取结果;如果计算尚未完成,则阻塞 get 方法。一旦计算完成,就不能再重新开始或取消计算.
package concurrent;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;

/**
 * FutureTask
 * 
 * @author user
 * 
 */
public class FutureTaskTest {

	private final FutureTask<ProductInfo> future = new FutureTask<ProductInfo>(
			new Callable<ProductInfo>() {
				public ProductInfo call() throws InterruptedException {
					return loadProductInfo();
				}
			});

	public ProductInfo loadProductInfo() throws InterruptedException {
		System.err.println("=====waiting========");
		Thread.sleep(5000);
		return new ProductInfo();
	}

	private final Thread thread = new Thread(future);

	public void start() {
		thread.start();
	}

	public ProductInfo get() throws InterruptedException, ExecutionException,
			TimeoutException {
		try{
			return future.get(1, TimeUnit.SECONDS);
		} catch(TimeoutException e) {
                        //future.cancel(true); //取消任务
			System.err.println("火速返回,失败!");
			return future.get(10, TimeUnit.SECONDS);
		}
	}

	/**
	 * @param args
	 * @throws ExecutionException
	 * @throws InterruptedException
	 * @throws TimeoutException
	 */
	public static void main(String[] args) throws InterruptedException,
			ExecutionException, TimeoutException {
		FutureTaskTest test = new FutureTaskTest();
		test.start();
		System.err.println("=======begin========");
		System.err.println(test.get());
		System.err.println("=======end========");
	}

}

class ProductInfo {
	public String toString() {
		return "**ProductInfo**";
	}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics