最近比较公司没什么事做,闲下来,有空就写写博客吧,当是笔记什么的都好。
最近看AsyncTask的源码,看到了FutureTask ,忍不住去学习了一下,下面总结一下:
1.Callable和Future
Callable其实和Runnable没什么不同,只是Runnable没参数返回,Callable有参数返回。而且Callable只能配合ExecutorService来在线程池里使用。
Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。
这两个东东都是配合使用额。。。。。
代码:
class TaskWithResult implements Callable<String> {
private int id;
public TaskWithResult(int id) {
this.id = id;
}
@Override
public String call() throws Exception {
return "result of TaskWithResult " + id;
}
}
ExecutorService exec = Executors.newCachedThreadPool(); ;
Future<String> result=exec.submit(new TaskWithResult(2));
Log.i("执行结果",result);
exec.shutdown();
2.FutureTask
看源码知道,这个东西implments于Runnable和Future接口,集成了Runnable和Future的功能。这个多用于线程状态的获取,主线程可以在完成自己子线程的任务后,再去获取结果。额,这个强大好多。。。
贴贴代码:
贴贴代码:
ExecutorService executorService= Executors.newFixedThreadPool(5);//创建线程池大小为5的固定线层池
Runnable runnable=new WorkThreadRunnable(1);
FutureTask futureTask=new FutureTask(runnable,"测试结果");
executorService.execute(futureTask);
sleep(3000);
try {
String result= (String) futureTask.get();//设定返回的结果为字符串
Log.e("执行结果",result+""); //打印可以看到为"测试结果"
Log.e("futureTask", futureTask.isDone()+futureTask.isCancelled());//打印线程执行状态
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
private class WorkThreadRunnable implements Runnable {
private int i;
public WorkThreadRunnable(int i){
this.i=i;
}
@Override
public void run() {
Log.e("WorkThread", "在执行第" + i + "线程");
sleep(1000*i);
}
}
private void sleep(int time){
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
FutureTask还有一种实例化:FutureTask futureTask=new FutureTask(Callable callable);这个是差不多的,只不过把返回结果塞在了Callable里面的方法返回而已。