实现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.