用于记录多线程相关知识点的:
1. 功能
2. 关系
3. 用Thread执行Callable
Java中实现多线程可能会用到java.lang.Thread、java.lang.Runnable、java.util.concurrent.callable这三个知识点。
Thread:继承Runnable接口.
功能:启动和控制线程。包括了线程创建、启动、阻塞、等待、终止等控制。
Runnable: 无返回结果
功能:用于自定义线程无返回值的执行体
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
Callable: 返回线程执行结果的
功能:用于自定义线程有返回值的执行体
@FunctionalInterface
public interface Callable<V> {
V call() throws Exception;
}
2. 关系:
创建一个线程的需要一个执行者和被执行的执行体。而Thread就是执行者,控制整个线程的运行。Runnable、Callable是被执行的执行体。且一个执行者可以执行多个被执行的执行体
3. 用Thread执行Callable
我们去看到Thread没有传入Callable参数的构造函数,所以Callable的执行者就成了问题???
这里我们就要认识Java.util.concurrent包下的FutureTask类:
继承RunnableFuture
于是我们可以把FutureTask转换为Runnable,而FutureTask的构造函数可以接受Callable
所以new FutureTask(Callable)------向上转型-----》Runnable,就可以给Thread使用了。多说一句,FutureTask只有线程的控制方法,没有启动方法。我们才会将FutureTask托管给Thread或线程池。