06 005【JUC】java实现多线程的四种方式之三:实现Callable接口

实现Callable接口

关键:Callable、FutureTask、Runnable、适配器模式

package com.magic.juc0117;

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

/**
 * @Description
 * 与Runnable接口有3点不同
 * 实现方法
 * 异常
 * 返回值 void Integer
 * @Author Chelsea
 * @Date 2020/1/18 12:25
 */

class MyThread1 implements Runnable
{

    @Override
    public void run() {

    }
}
class MyThread implements Callable<Integer>
{
//@FunctionalInterface
//public interface Callable<V>
//查看源码可见Callable是函数式接口,只需要实现一个call()方法

    @Override
    public Integer call() throws Exception {
        System.out.println("come in call");
        return 1024;
    }
}
public class CallableDemo {

    public static void main(String[] args) throws Exception {
       
         /**
         * 其实源码用到了 适配器模式
         * 查看API(以下皆来源于API)可以了解到对于Callable没有适合的构造方法,
         * 其中Thread的构造方法之一Thread(Runnable target, String name),
         * java工作人员采用了适配器模式:
         * Runnable的实现类之一FutureTask,而FutureTask两中构造方法
         * 1.FutureTask(Callable<V> callable)
         * 创建一个 FutureTask ,它将在运行时执行给定的 Callable ;
         * 2.FutureTask(Runnable runnable, V result)
         * 创建一个 FutureTask ,将在运行时执行给定的 Runnable ,并安排 get将在成功完成后返回给定的结果;
         * 由上面可知我们用第一种即可。
         */
        //Runnable 用 new Thread(futureTask,"A") Callable也可以哦
        FutureTask<Integer> futureTask = new FutureTask(new MyThread());
        new Thread(futureTask,"A").start();
        Integer result = futureTask.get();
        System.out.println(result);
    }
}

ps.后续会把另外三种实现方式补齐,不定期。

学习整理于JUC.

发布了53 篇原创文章 · 获赞 0 · 访问量 371

猜你喜欢

转载自blog.csdn.net/weixin_40778497/article/details/104039952