Callable实现多线程


一、Callable接口定义

  • 从最传统的方法来讲如果要进行多线程的实现肯定依靠的就是Runnable,但是Runnable接口有一个缺点:当线程执行完毕后无法获取一个返回值,所以从JDK1.5之后就提出了一个新的线程实现接口:java.util.concurrent.Callable接口。

    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;
    }
    
  • 优点:

    1. 可以获得任务执行返回值。
    2. 和Future结合,利用Future跟踪异步计算的结果。

二、Future接口

  • Future接口代表了一个异步计算的结果。
  • 通过get()方法得到结果。

三、Callable执行方式

  • 借助FutureTask类执行

    • FutureTask类同时实现了两个接口:Future以及Runnable接口。
    • 由于FutureTask类实现了Runnable接口,所以Thread和Callable就建立了联系,Callable可以借助FutureTask来调用Thread里面的start()方法来启动多线程程序。
  • 执行流程:

    // 定义Callable的实现类重写call()方法实现业务
    class MyThreadCall implements Callable<String> {
        @Override
        public String call() throws Exception {
            for (int i = 0; i < 10; i++) {
                System.out.println("******线程执行,i = " + i);
            }
            return "线程执行完毕。";
        }
    }
    
    public class CallableDemo {
        public static void main(String[] args) throws ExecutionException, InterruptedException {
            // new一个Callable的实现类并传入FutureTask
            FutureTask<String> task = new FutureTask<String>(new MyThreadCall());
            // 将task传入Thread中调用start()方法启动程序
            new Thread(task).start();
            // 通过get()方法得到线程返回的数据
            System.out.println("【线程返回数据】" + task.get());
        }
    }
    
    // 执行结果
    ******线程执行,i = 1
    ******线程执行,i = 2
    ******线程执行,i = 3
    ******线程执行,i = 4
    ******线程执行,i = 5
    ******线程执行,i = 6
    ******线程执行,i = 7
    ******线程执行,i = 8
    ******线程执行,i = 9
    【线程返回数据】线程执行完毕。
    

    **在执行结果里面我们可以看到,task.get()成功的得到了返回值

  • 作者:周海林(联系作者)
  • 发表时间:2021-04-12
  • 版权声明:自由转载-非商用-非衍生-周海林贼帅
  • 加作者微信:请在文末添加作者微信

评论