返回首页
当前位置: 主页 > 编程语言 > JAVA教程 >

java多线程之FutureTask类使用教程

时间:2013-11-30 03:16来源:电脑教程学习网 www.etwiki.cn 编辑:admin

本章来介绍jdk5.0中一种有用的同步工具类FutureTask,我们可以用FutureTask来实现某种比较耗时的计算,当调用get时如果任务计算完成就会立即返回结果,否则get将阻塞直到任务完成状态。下面看我写的一个例子,通过FutureTask提前启动计算,可以来减少需要等待的时间.

package com.thred;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class FutureTest {

public static void main(String[] args) {
Preloader preloader = new Preloader();
preloader.start();
List<String> datas = null;
datas = preloader.getDatas();

for (String str : datas) {
System.out.println(str);
}
}

}

class Preloader {
private Callable<List<String>> callable = new Callable<List<String>>() {
@Override
public List<String> call() throws Exception {
return downloadData();
}
};

private Thread thread;
private FutureTask<List<String>> future;

private List<String> downloadData() {
List<String> list = new ArrayList<String>();
// 模拟下载数据
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 10; i++) {
list.add("data" + i);
}
return list;
}

private void init() {
future = new FutureTask<List<String>>(callable);
thread = new Thread(future);
}

public Preloader() {
init();
}

public void start() {
thread.start();
}

public List<String> getDatas() {
try {
return future.get();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return null;
}

}

通过上面的例子,我们可以知道FutureTask非常适合那种比较耗时的计算并且可以提前启动的场景,例如我们在开发安卓程序的时候,在打开一个Activity的时候,可以用FutureTask提前启动去获取比较耗时的资源,当调用get方法的时候,如果我们的计算还没结束会阻塞到任务计算完成为止,如果计算已经完毕就会立即返回,这样可以提高我们的用户体验.

------分隔线----------------------------
标签(Tag):java java技巧 java实例教程 java源代码 java基础教程
------分隔线----------------------------
推荐内容
猜你感兴趣