参考来源:书籍 深入浅出Java多线程
http://concurrent.redspider.group/RedSpider.html
https://redspider.gitbook.io/concurrent/
一、Thread类和Runnable接口
Thread类是Runnable接口的一个实现类,封装了一些常用方法。
start()和run()方法的区别
调用start()方法,虚拟机会创建一个线程,然后等到这个线程第一次得到时间片时再调用run()方法。是异步执行。
直接调用run()方法和调用普通方法没区别,是同步执行。
二、Callable、Future与FutureTask
Callable接口和Runnable类似,但支持泛型返回值。配合使用Future接口可获取返回值。
Future接口和Callable接口配合使用获取线程的返回值。
FutureTask是Future接口的具体实现,且实现Runnable接口。实现了cancel,get,isDone等方法,方便使用。
实现多线程的方式:
继承Thread类,并重写run方法;
实现Runnable接口的run方法;
实现Callable接口的call方法,配合线程池工具ExecutorService来使用;有返回值,可取消(不一定能取消成功)
如何使用:
如果不需要使用Thread类中的一些方法,我们通常优先使用“实现Runnable接口”这种方式来自定义线程类。
如果需要返回值或需要取消功能使用Callable接口。
FutureTask的构造方法会将提交的Runnable或Callable任务都会被包装成FutureTask。
FutureTask最终将Runnabl转化为Callable,这里使用了适配器模式实现,由Executors源码可知。
FutureTask源码分析 https://my.oschina.net/7001/blog/875658