美文网首页
Callable、Future和FutureTask

Callable、Future和FutureTask

作者: 卡路fly | 来源:发表于2020-04-03 15:12 被阅读0次

    Callable

    @FunctionalInterface
    public interface Callable<V> {
        /**
         * Computes a result, or throws an exception if unable to do so.
         *
         * @return computed result
         * @throws Exception if unable to compute a result
         */
        V call() throws Exception;
    }
    

    Runnable

    Callable与Runnable作用一样,区别在于Callable有返回值,并且出现异常能抛出来。

     @FunctionalInterface
    public interface Runnable {
        public abstract void run();
    }
    

    FutureTask

    FutureTask是Future接口的一个唯一实现类。

    public class FutureTask<V> implements RunnableFuture<V> 
    

    RunnableFuture

    public interface RunnableFuture<V> extends Runnable, Future<V> {
        /**
         * Sets this Future to the result of its computation
         * unless it has been cancelled.
         */
        void run();
    }
    

    Future

    Future根据源代码解释其作用是对Callable或者Runnable进行管理,取消、检测完成与否获取最终结果等。

    public interface Future<V> {
    
        boolean cancel(boolean mayInterruptIfRunning);
        boolean isCancelled();
        boolean isDone();
        V get() throws InterruptedException, ExecutionException;
        V get(long timeout, TimeUnit unit)
            throws InterruptedException, ExecutionException, TimeoutException;
    }
    
    • cancel方法用来取消任务(取消任务成功则返回true,否则返回false)。参数mayInterruptIfRunning表示是否允许取消正在执行却没有执行完毕的任务,如果设置true,则表示可以取消正在执行过程中的任务。如果任务已经完成,则无论mayInterruptIfRunning为true还是false,此方法肯定返回false,即如果取消已经完成的任务会返回false;如果任务正在执行,若mayInterruptIfRunning设置为true,则返回true,若mayInterruptIfRunning设置为false,则返回false;如果任务还没有执行,则无论mayInterruptIfRunning为true还是false,肯定返回true。

    • isCancelled方法表示任务是否被取消成功,如果在任务正常完成前被取消成功,则返回 true。

    • isDone方法表示任务是否已经完成,若任务完成,则返回true;

    • get()方法用来获取执行结果,这个方法会产生阻塞,会一直等到任务执行完毕才返回;

    • get(long timeout, TimeUnit unit)用来获取执行结果,如果在指定时间内,还没获取到结果,就直接返回null。

    示例Demo:

    package FutureTaskCallable;
    
    import java.util.concurrent.*;
    
    class FutureTaskDemo {
        public static void main(String[] args) {
            // 创建一个ExecutorService对象
            ExecutorService executor = Executors.newCachedThreadPool();
            // new 一个Callable实例
            Task task = new Task();
            // new一个
            FutureTask<Integer> futureTask = new FutureTask<>(task);
            // 提交futureTask对象进入线程池
            executor.submit(futureTask);
            // 关闭线程池
            executor.shutdown();
    
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
    
            System.out.println("主线程在执行任务");
    
            try {
                // 获取futuretask结果
                System.out.println("task运行结果" + futureTask.get());
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
    
            System.out.println("所有任务执行完毕");
        }
    
    
        public static 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;
            }
        }
    }
    
    

    相关文章

      网友评论

          本文标题:Callable、Future和FutureTask

          本文链接:https://www.haomeiwen.com/subject/msghphtx.html