`
raymond.chen
  • 浏览: 1418014 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

FutureTask的使用

 
阅读更多

FutureTask是一种可以取消的异步的计算任务。它的计算是通过Callable实现的,它等价于可以携带结果的Runnable,并且有三个状态:等待、运行和完成。完成包括所有计算以任意的方式结束,包括正常结束、取消和异常。

 

FutureTask类是Future 的一个实现,并实现了Runnable,所以可通过Excutor(线程池) 来执行,也可传递给Thread对象执行。

 

如果在主线程中需要执行比较耗时的操作时,但又不想阻塞主线程时,可以把这些作业交给Future对象在后台完成,当主线程将来需要时,就可以通过Future对象获得后台作业的计算结果或者执行状态。

 

public class MyFutureTask extends FutureTask<String> {
	public MyFutureTask(Callable<String> callable) {  
        super(callable);  
    }  
	
	@Override
	protected void done() {
		try {
			System.out.println(get() + " 线程执行完成!");
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
	}
	
}

 

public class Test3 {
	public static void main(String[] args) {
		ExecutorService executor = Executors.newCachedThreadPool();
		
		Callable<String> callable = new Callable<String>() {
			@Override
			public String call() throws Exception {
				return "Task say hello";
			}
		};
		
		//新建一个任务
		MyFutureTask futureTask = new MyFutureTask(callable);
		
		//异步执行任务
        executor.submit(futureTask); 
        
		try{
			//继续做事情
			System.out.println("do something...");
			Thread.sleep(3000);
			
			//获取任务的执行结果
			System.out.println(futureTask.get()); //get方法会导致阻塞,直到返回结果
			
			//继续做事情
			System.out.println("do something...");
		}catch(Exception ex){
			ex.printStackTrace();
		}
		
		executor.shutdown();
	}
	
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics