1.直接创建Thread并重写run方法
在这里可以简写匿名内部类
对于只有一行的代码也可以用lambda表达式简化。(jdk8以后)
通过start方法启动线程。
2.通过继承Thread类并重写run方法实现
这边懒得新建文件统一用内部类的方式实现。
3.通过实现Runnable接口
这个方法起始是线程与任务分离,更加符合合成复用原则,相比于继承Thread的方式,这种更加灵活。
4.通过FutureTask<T>创建线程
本质是实现Callable接口中的call方法,而在本质就是实现Runnable接口与Future接口
可自行阅读源码,Ctrl+B进入源码。
由于前面几种不能满足需要处理返回值的情况,于是FutureTask的优势也更加突出。
通过将FutureTask传入Thread中,task通过get方法就可以获取线程返回结果,get方法是一个阻塞的过程会等着线程结果的返回,而FutureTask的泛型表示返回结果的类型。
5.结语
新人入门,有问题请大家指正