深入了解线程三大实现
一般线程创建有三种方式:继承Thread类、实现Runnable接口、实现Callable接口
区别:
1、继承Thread类方式如下
缺点;不能多继承,所以引出了Runnable
2、实现Runnable接口:
缺点:无返回值,引出了Callable接口:
接下来看下main方法里各行代码含义:
第二行
首先为什么Thread调用start方法会自动调用run方法,如下JVM会自动启动Tread的run方法:
而Thread实现了Runnable接口,并且实现了run方法,所以Thread.start()实际上是调用了Runnable的run方法,原因在于start方法启动了一个新的线程(底层源码处有解释),将会并行的运行Runnable中的run方法,如果直接Thread.run()将不能并行运行。
而FutureTask实现了RunnableFuture接口,RunnableFuture接口继承了Runnable和Future接口:
所以运行satrt方法就是开始FutureTask中的run方法,在run方法中会调用call方法(也就是Callable里的call方法)并将结果通过set方法放进去,所以get方法就能得到Callable返回值: