Java多线程之FutureTask的使用与理解
FutureTask的类图
从FutureTask的类图中可以看出,FutureTask实现了Runnable接口和Future接口,所以它兼备Runnable和Future两种特性,下面先来看看如何使用FutureTask来启动一个新的线程:
1 public class FutureTaskDemo { 2 public static void main(String[] args) { 3 ACallAble aCallAble = new ACallAble(); 4 FutureTask futureTask = new FutureTask(aCallAble); 5 Thread thread = new Thread(futureTask); 6 thread.start(); 7 do { 8 9 }while (!futureTask.isDone()); 10 try { 11 Object result = futureTask.get(); 12 System.out.println("Result:"+result); 13 } catch (InterruptedException e) { 14 e.printStackTrace(); 15 } catch (ExecutionException e) { 16 e.printStackTrace(); 17 } 18 } 19 20 } 21 class ACallAble implements Callable{ 22 23 @Override 24 public Object call() throws Exception { 25 Thread.sleep(1000); 26 return "Thread-Name:"+Thread.currentThread().getName(); 27 } 28 }
可以看到,使用FutureTask来启动一个线程之后,我们可以监控这个线程是否完成,上面的示例中主线程会一直等待这个新创建的线程直到它返回,其实只要是Future提供的接口,我们在FutureTask中都可以使用,这极大的方便了我们,Future在并发编程中的意义极为重要,Future代表一个未来会发生的东西,它是一种暗示,一种占位符,它示意我们它可能不会立即得到结果,因为它的任务还在运行,但是我们可以得到一个对这个线程的监控对象。
我们可以对线程的执行做一些判断,甚至是控制,比如,如果我们觉得我们等了太久,并且我们觉得没有必要再等待下去的时候,就可以将这个Task取消,还有一点需要提到的是,Future代表它可能正在运行,也可能已经返回,当然Future更多的暗示你可以在等待这个结果的同时可以使用其他的线程做一些其他的事情,当你真的需要这个结果的时候再来获取就可以了,这就是并发,理解这一点非常重要。