1. 继承 Thread 类
@Slf4j
public class MyThread extends Thread {
@Override
public void run() {
log.info("MyThread run ...");
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
}
}
2. 实现 Runnable 接口
@Slf4j
public class MyRunnable implements Runnable {
@Override
public void run() {
log.info("MyRunnable run...");
}
public static void main(String[] args) {
Thread thread = new Thread(new MyRunnable());
thread.start();
}
}
3. 实现 Callable 接口
演示 1~100 的累加
@Slf4j
public class MyCallable implements Callable<Integer> {
@Override
public Integer call() throws Exception {
return IntStream.rangeClosed(0, 100).boxed().reduce(Integer::sum).orElse(0);
}
public static void main(String[] args) throws Exception {
FutureTask<Integer> futureTask = new FutureTask<>(new MyCallable());
Thread thread = new Thread(futureTask);
thread.start();
Integer total = futureTask.get();
log.info("合计金额:" + total);
}
}
4. 继承 Thread 类和实现 Runnable 接口的区别
4.1 Thread 的构造方法
入参为 Runable 的构造方法会将传入的 Runable 赋值给 Thread 的 target 属性
4.2 Thread 的 run 方法
Thread 的 run 方法判断其 target 属性是不是为 null,如果不为 null 则调用 target 方法
4.2 小结
- 继承 Thread 类:线程调用的是子类重写的 run 方法
- 实现 Runable 接口:线程调用的是Thread 的 run 方法
5. 实现 Callable 接口与其他两种方式的区别
Callable + FutureTask 的组合形式有返回值,也可以指定等待时间,其它两种方式没有返回值