Java——Future接口的简单使用

38 阅读2分钟

并行,并发的区别

并发:一个物理CPU上,多个任务有序的执行,指处理多个同时性任务的能力

并行:多个物理CPU上,多个任务同时执行,每一个CPU执行一个任务,可以同时处理的多个任务

用户线程和守护线程介绍

用户线程是系统的工作线程,会完成程序需要完成的业务操作。

守护线程是一种特殊的线程,为其他线程服务的,在后台默默的完成一些系统性的服务,如GC线程;

如果用户线程全部结束,意味着程序需要完成的业务操作已经结束了,守护线程就没有必要继续运行了。所以当系统只剩下守护线程的时候,java虚拟机会自动退出。

1、Future

Future接口(实现类FutureTask)定义了操作异步任务执行的一些方法,如获取异步任务执行的结果、取消任务的执行、判断任务是否被取消,判断任务是否执行完毕等。

Future接口可以为主线程开一个分支线程,专门为主线程处理耗时和费力的复杂异步计算任务。

Future接口方法介绍

取消异步任务:

boolean cancel(boolean mayInterruptIfRunning);

判断异步任务是否被取消

boolean isCancelled();

判断异步任务是否执行完毕

boolean isDone();

获取异步任务执行的结果:

V get() throws InterruptedException, ExecutionException;

获取异步任务执行的结果(限定时间内没获取到结果就抛出异常):

V get(long timeout, TimeUnit unit)
    throws InterruptedException, ExecutionException, TimeoutException;

注:get方法获不加超时判断获取执行结果会出现程序阻塞,所以get方法一般放到程序最后调用

示例代码

//固定大小线程池
ExecutorService threadPool = Executors.newFixedThreadPool(3);

FutureTask<String> futureTask1 = new FutureTask<>(()->{
    TimeUnit.MICROSECONDS.sleep(500);
    return "callable1";
});
threadPool.submit(futureTask1);

FutureTask<String> futureTask2 = new FutureTask<>(()->{
    TimeUnit.SECONDS.sleep(3);
    return "callable2";
});
threadPool.submit(futureTask2);

//获取异步任务执行结果
while (true){
    if (futureTask1.isDone()){
        System.out.println(futureTask1.get());
        break;
    }
}
System.out.println(futureTask2.get(2,TimeUnit.SECONDS));

//关闭线程池
threadPool.shutdown();