一:创建线程的三种方式:
1.继承Thread类
2.实现Runnable接口
3.使用Callable接口
二:创建线程的具体实现步骤:
1.继承Thread类
(1).先继承 Thread类,并且重写run方法
(2).创建对象(线程对象)
(3).调用start方法,来启动线程任务
2.实现Runnable接口
(1).实现Runnable接口,并重写 run方法
(2). 创建该类的实例对象,将该对象作为构造器参数传入Thread类实例对象,这个对象才是真正的线程对象;
(3).调用线程对象的start()方法启动该线程;
3.实现Callable接口
(1).创建Callable接口实现类,并实现call()方法,该方法将作为线程执行体,且该方法有返回值,再创建Callable实现类的实例;
(2).使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值;
3).使用FutureTask对象作为Thread对象的target创建并启动新线程,调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
二.创建线程的三种方式的对比
1.实现Runnable或Callable接口比继承Thread类的优势
(1)Runnable或Callable接口适合多个线程进行资源共享
(2)java中单一继承,但是多接口实现,提高扩展性
(3)增加程序的健壮性,代码和数据独立
(4)线程池只能放入Runable或Callable接口实现类,不能直接放入继承Thread的类
2.Callable和Runnable之间的区别
(1) Callable重写的是call()方法,Runnable重写的方法是run()方法
(2) call()方法执行后可以有返回值,run()方法没有返回值
(3) call()方法可以抛出异常,run()方法不可以
(4) 运行Callable任务可以拿到一个Future对象,表示异步计算的结果 。通过Future对象可以了解任务执行情况,可取消任务的执行,还可获取执行结果