FutureTask的使用

FutureTask 有点类似Runnable,都可以通过Thread来启动,不过FutureTask可以返回执行完毕的数据,并且FutureTask的get方法支持阻塞。
由于:FutureTask可以返回执行完毕的数据,并且FutureTask的get方法支持阻塞这两个特性,我们可以用来预先加载一些可能用到资源,然后要用的时候,调用get方法获取(如果资源加载完,直接返回;否则继续等待其加载完成)。

public class PreLoaderUseFutureTask{
    private FutureTask<String> futuretask = new FutureTask<String>(new Callable(){

        @Override
        public Object call() throws Exception {//线程中执行代码

            Thread.sleep(2000);
            return "线程执行中";
        }

    });

    Thread thread = new Thread(futuretask);

    public void start(){//启动线程获取数据
        thread.start();
    }

    public String getRes() throws InterruptedException, ExecutionException{
        return futuretask.get();//获取已经加载好的数据
    }


    public static void main(String[] args) {
        PreLoaderUseFutureTask prl = new PreLoaderUseFutureTask();
        prl.start();//启动预加载

        try {
            System.out.println(prl.getRes());//获取数据
        } catch (InterruptedException e) {

            e.printStackTrace();
        } catch (ExecutionException e) {

            e.printStackTrace();
        }
    }


}
public  class BookInstance{
    private int currentpage;

    private FutureTask<String> ft = new FutureTask<String>(new Callable<String>() {

        @Override
        public String call() throws Exception {

            return loadDataFromNet();
        }


    });

    public  String loadDataFromNet() {

        return this.currentpage+"from net reture the pagecontent .....";
    }

    public String getcurrentcontent() throws InterruptedException, ExecutionException{//获取当前页面的内容,同时缓存下一个页面的内容

        String congtent =ft.get();      
        currentpage++;
       new Thread(ft=new FutureTask<String>(new Callable<String>() {

            @Override
            public String call() throws Exception {

                 return loadDataFromNet(); 
            }
        })).start();


        return congtent;

    }

    public BookInstance(int currentPage)  
  {  
      this.currentpage = currentPage;  
      /** 
       * 直接启动线程获取当前页码内容 
       */  
      Thread thread = new Thread(ft);  
      thread.start();  
  } 

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        BookInstance instance = new BookInstance(1);  
      for (int i = 0; i < 10; i++)  
      {  
          long start = System.currentTimeMillis();  
          String content = instance.getcurrentcontent();  
          System.out.println("[1秒阅读时间]read:" + content);  
          Thread.sleep(1000);  
          System.out.println(System.currentTimeMillis() - start);  
      }  
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值