FutureTask的使用

    xiaoxiao2022-06-23  40

    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); } } }
    转载请注明原文地址: https://ju.6miu.com/read-1123462.html

    最新回复(0)