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);
}
}
}