Thread、Runnable、Callable、Future、FutureTask,你能详细讲出他们的内部关系么?这也是面试经常问到的问题。
1. Thread 和 Runnable
1.1 Thread
我们先看一下 Thread 最简单的使用姿势:
public class MyThread extends Thread {
public MyThread(String name) {
super(name);
}
@Override
public void run() {
String name = Thread.currentThread().getName();
System.out.println(name + "已经运行");
}
public static void main(String[] args) {
new MyThread("线程一").start();
}
}
线程包含 4 个状态:创建 -> 就绪 -> 运行 -> 结束。
当执行 start() 后,线程进入就绪状态,当对应的线程抢占到 cpu 调度资源之后,进入运行状态,此时调用的是 run 方法,执行完毕之后就结束了。
1.2 Runnable
我们看一下 Runnable 最简单的使用姿势:
public class MyTask implements Runnable {
@Override
public void run() {
String name = Thread.currentThread().getName();
System.out.println(name + "已经运行");
}
public static void main(String[] args) {
new Thread(new MyTask(),"线程二").start();
}
}
这里 MyTask 就是一个 Runnable,实现了 run() 方法,作为 Thread() 的入参。
基本所有同学都知道这样使用,但是你们知道原理么?
1.3 Thread 和 Runnable 的关系
我们看一下 Runnable 的接口定义:
public interface Runnable {
/**
* When an object implementing interface <code>Runnable</code> is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that it may
* take any action