Java并发之Future类和Callable类详解

来源:互联网 发布:晋明帝 司马懿 知乎 编辑:程序博客网 时间:2024/06/08 02:44
有时候在实际应用中,某些操作很耗时,但又不是不可或缺的步骤。比如用网页浏览器浏览新闻时,最重要的是显示文字内容,至于与新闻相匹配的图片就没有那么重要的,所以此时首先保证文字信息先显示,而图片信息会后显示,但又不能不显示,由于下载图片是一个耗时的操作,所以必须一开始就得下载。 


Java的并发库的Future类就可以满足这个要求。Future的重要方法包括get()和cancel(),get()获取数据对象,如果数据没有加载,就会阻塞直到取到数据,而 cancel()是取消数据加载。另外一个get(timeout)操作,表示如果在timeout时间内没有取到就失败返回,而不再阻塞。 

下面的Demo简单的说明了Future的使用方法:一个非常耗时的操作必须一开始启动,但又不能一直等待;其他重要的事情又必须做,等完成后,就可以做不重要的事情。 
Java代码  收藏代码
  1. package concurrent;  
  2.   
  3. import java.util.concurrent.Callable;  
  4. import java.util.concurrent.ExecutionException;  
  5. import java.util.concurrent.ExecutorService;  
  6. import java.util.concurrent.Executors;  
  7. import java.util.concurrent.Future;  
  8.   
  9. public class TestFutureTask {  
  10.     public static void main(String[] args) throws InterruptedException,ExecutionException{  
  11.         final ExecutorService exec = Executors.newFixedThreadPool(5);  
  12.           
  13.         Callable call = new Callable(){  
  14.             public String call() throws Exception{  
  15.                 Thread.sleep(1000 * 5);  
  16.                 return "Other less important but longtime things.";  
  17.             }  
  18.         };  
  19.         Future task = exec.submit(call);  
  20.         //重要的事情  
  21.         Thread.sleep(1000 * 3);  
  22.         System.out.println("Let's do important things.");  
  23.         //其他不重要的事情  
  24.         String obj = (String)task.get();  
  25.         System.out.println(obj);  
  26.         //关闭线程池  
  27.         exec.shutdown();  
  28.     }  
  29. }  


运行结果: 
Java代码  收藏代码
  1. Let's do important things.  
  2. Other less important but longtime things.