Future
Java现在的多线程机制,核心方法run是没有返回值的;如果要得到run方法里面的计算结果,调用mThread.join()保证值返回,必须等待run方法计算完,无论计算过程多么耗时,才会进行下一步。
而Future的核心思想是:分别启动方法去计算几个耗时的操作,不需要等待1计算结果返回才去计算2,等2计算结果返回才去计算3,显然不明智。
·get方法:获取计算结果(如果还没计算完,也是必须等待的)
·cancel方法:还没计算完,可以取消计算过程
·isDone方法:判断是否计算完
·isCancelled方法:判断计算是否被取消
long start = System.currentTimeMillis();
//买10斤萝卜5秒
Callable callable1 = new Callable() {
@Override
public String call() throws Exception {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "买10斤萝卜";
}
};
FutureTask<String> futureTask1 = new FutureTask<String>(callable1);
new Thread(futureTask1).start();
//买2斤猪肉3秒
Callable callable2 = new Callable() {
@Override
public Object call() throws Exception {
try {
Thread.sleep(1000 * 3);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "买2斤猪肉";
}
};
FutureTask<String> futureTask2 = new FutureTask<String>(callable2);
new Thread(futureTask2).start();
try {
Log.d(TAG, "init: 5秒" + futureTask1.get());
Log.d(TAG, "init: 3秒" + futureTask2.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
long end = System.currentTimeMillis();
Log.d(TAG, "本来需要8秒才能买完菜,使用了FutureTask后的总时间为:" + (end - start));
输出结果:
init: 5秒买10斤萝卜
init: 3秒买2斤猪肉
本来需要8秒才能买完菜,使用了FutureTask后的总时间为:5028