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);  
      }  
    }
}
FutureTask是一个实现了RunnableFuture接口的类,它继承了Runnable和Future接口。因此,FutureTask既可以被当作一个Runnable来使用,也可以被当作一个Future使用FutureTask实现了Future接口,完成了对Future接口的基本实现。除了实现了Future接口以外,FutureTask还实现了Runnable接口,这意味着它可以交由Executor执行,也可以直接用线程调用执行(futureTask.run())。 FutureTask具有三种执行状态:未启动、已启动和已完成。未启动指的是在调用run()方法之前,FutureTask处于未启动状态。已启动指的是FutureTask对象的run方法正在执行过程中,FutureTask处于已启动状态。已完成指的是FutureTask正常执行结束,或者被取消,或者执行过程中抛出异常而导致中断而结束。 在ThreadPoolExecutor的submit方法中,返回的是一个Future的实现,而这个实现就是FutureTask的一个具体实例。FutureTask帮助实现了具体的任务执行,并与Future接口中的get方法关联起来。 总结起来,FutureTask是一个能够同时担任Runnable和Future角色的类,它可以作为一个任务提交给线程池执行,也可以通过get方法来获取任务执行的结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【第十二篇】Java 线程FutureFutureTask【重点】](https://blog.csdn.net/weixin_42039228/article/details/123198358)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [FutureTask简介](https://blog.csdn.net/u014516601/article/details/125123415)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值