8.1J.U.C-FutureTask

FutureTask是JUC包下的,他对线程结果处理很值得我们学习,不过它并不是AQS的子类

创建一个线程通常有继承Thread实现Runnable两种方式,但这两种方法都存在一个公同的缺陷,即在执行完任务之后,无法获取执行结果

从Java1.5之后就提供了Callable和Future,通过他们可以在任务执行完之后得到任务执行的结果

package com.moluo.concurrency.aqs;

import java.util.concurrent.*;

public class FutureExample {

    static class MyCallable implements Callable<String> {
        @Override
        public String call() throws Exception {
            System.out.println("do something in callable");
            Thread.sleep(5000);
            return "done";
        }
    }

    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService executorService = Executors.newCachedThreadPool();
        Future<String> future = executorService.submit(new MyCallable());
        System.out.println("do something in main");
        Thread.sleep(1000);
        String futureTaskResult = future.get();
        System.out.println(futureTaskResult);
        executorService.shutdown();
    }
}

FutureTask类

FutureTask实现了RunnableFuture接口,而RunnableFuture接口继承了Runnable接口和Future接口。FutureTask有两个构造方法:

  • FutureTask(Callable callable)

  • FutureTask(Runnable runnable, V result)

第二个构造方法,入参是Runnable将转换为Callable

package com.moluo.concurrency.aqs;

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

public class FutureTaskExample {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<String> futureTask = new FutureTask<>(new Callable<String>() {
            @Override
            public String call() throws Exception {
                System.out.println("do something in callable");
                Thread.sleep(5000);
                return "done";
            }
        });
        new Thread(futureTask).start();
        System.out.println("do something in main method");
        Thread.sleep(1000);
        String futureTaskResult = futureTask.get();
        System.out.println(futureTaskResult);
    }
}

Last updated

Was this helpful?