方法一:继承Thread类
1、定义一个线程类继承Thread
2、重写run方法,里面是定义线程以后要干什么
3、new一个新线程对象
4、调用start方法启动线程(执行的还是run方法)
优缺点:
优:编码简单
缺:线程类已经继承了Thread,无法继承其他类,不利于扩展
注意点:
//如果调用run会被当初一个普通方法
//要把子线程放在主线程之前,不然会导致主线程一直先跑完
方法二:实现Runnable接口
1、定义一个线程任务类,实现Runnable接口
2、重新run方法,定义线程执行任务
3、创建一个任务对象
4、把任务对象交给Thread处理
5、启动线程
优缺点:
优:利用接口实现,可继续继承类和实现接口,拓展性强
缺:编程时多一层对象包装,如果线程有执行结果不能直接返回
注意点:
可利用匿名类实现 简化代码
new Thread ( () -> { for(int i=0; i<10; i++){ System.out.println("子线程3执行输出"+i); } }).start(); |
前两种方式都不能直接返回结果
方法三:利用Callable、FutureTask接口实现
1、定义任务类实现Callable接口,应该申明线程任务执行完毕后的结果的数据类型
2、重写call方法(任务方法)
3、创建Callable任务对象
4、把Callable任务对象交给FutureTask
5、交给线程处理
6、启动线程
优缺点:
优:利用接口实现,可继续继承类和实现接口,拓展性强
可以在线程结束后去获取线程执行的结果
缺:编码复杂一点