Runnable的缺陷
不能返回返回值
不能拋出Checked Exception
Callable接口
實現(xiàn)call()
有返回值
可以拋出異常
Future類
Future和Callable的關(guān)系
Future的5個方法
1. get() :獲取結(jié)果
2. get(long time, TimeUnit unit):有超時的獲取
3. cancel():取消任務(wù)
4. isDone(): 判斷線程是否執(zhí)行完畢
執(zhí)行完畢不代表成功執(zhí)行了挤庇,執(zhí)行失敗赏壹,或者被中斷也是執(zhí)行完畢了,不再執(zhí)行了
5. isCanceled():判斷是否被取消
get的基本用法
用法一:線程池的Submit方法返回Future對象
placeHolder是一個空的容器
/**
* 描述: 演示一個Future的使用方法
*/
public class OneFuture {
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(10);
Future<Integer> future = service.submit(new CallableTask());
try {
System.out.println(future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
service.shutdown();
}
static class CallableTask implements Callable<Integer> {
@Override
public Integer call() throws Exception {
Thread.sleep(3000);
return new Random().nextInt();
}
}
}
用法二:用FutureTask創(chuàng)建Future
Future嫂粟, FutureTask读虏, Runnable的關(guān)系
/**
* 描述: 演示FutureTask的用法
*/
public class FutureTaskDemo {
public static void main(String[] args) {
Task task = new Task();
FutureTask<Integer> integerFutureTask = new FutureTask<>(task);
// new Thread(integerFutureTask).start();
ExecutorService service = Executors.newCachedThreadPool();
service.submit(integerFutureTask);
try {
System.out.println("task運行結(jié)果:"+integerFutureTask.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}
class Task implements Callable<Integer> {
@Override
public Integer call() throws Exception {
System.out.println("子線程正在計算");
Thread.sleep(3000);
int sum = 0;
for (int i = 0; i < 100; i++) {
sum += i;
}
return sum;
}
}