分析&回答
Java中实现线程的两种方法
- 第一是实现Runnable接口实现它的run()方法。
- 第二种是继承Thread类,覆盖它的run()方法。
Java多线程实现的四种方式
- 1.继承Thread类,重写run方法
- 2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target
- 3.通过Callable和FutureTask创建线程 (通过第二种创建)
- 4.通过线程池创建线程(通过第一种创建)
反思&扩展
启动一个线程是用run()还是start()
两种方式都是使用start()方法,start方法内调用了run方法,如果直接调用run方法,那么就相当于没有开启线程而直接调用的run方法。
方式一:
Thread thread1 = new Thread(() -> System.out.println("Hello World from Runnable!"));
thread1.start();
方式二:
Thread thread2 = new Thread() {
@Override
public void run() {
System.out.println("Hello World from subclass!");
}
};
thread2.start();
两种实现线程的方法你会优先使用那种?实现Runnable接口具有什么优势
采用Runnable接口实现线程:
优势:
- A、线程类只是实现了Runnable接口,还可以继承其他的类(避免Java单继承)
- B、在这种方式下,可以多个线程共享同一个目标对象,所以很合适多个线程来处理同一份资源的情况(资源共享),从而可以将CPU、代码和数据分开(数据独立),形成清晰的模型,较好的面相对象思想。
劣势:编程稍微复杂,如果需要访问当前线程需要用Thread.currentThread方法来获取
采用继承Thread类的方式实现线程:
优势:编写简单,如果要获得当前线程直接this即可
劣势:线程类继承了Thread,不能在继承其他类
相对而言,用Runnable的方式更好,具体可以根据当前需要而定;使用 Lambda 表达式 + 匿名内部类实现超轻松。
喵呜面试助手: 一站式解决面试问题,你可以搜索微信小程序 [喵呜面试助手] 或关注 [喵呜刷题] -> 面试助手 免费刷题。如有好的面试知识或技巧期待您的共享!