时间:2023年06月27日
作者:小蒋聊技术
邮箱:wei_wei10@163.com
微信:wei_wei10
前言
大家好,欢迎来到小蒋聊技术,小蒋准备和大家一起聊聊技术的那些事。
大家常说金九银十毕业季,又是毕业生求职的好时机。虽然最近几年计算机行业不那么景气,但是为什么还是有大量人想要加入?想要求职的进入计算机行业的小伙伴们,大家千万不要被网上的只言片语、悲观情绪所左右,一定要有自己的思考和判断。
小蒋带着大家换一个角度来看看,每年行业平均从业人员数量和人员的平均工资的排行,你会发现计算机行业的就业机会和工资排名远远超过80%的行业。那网上大家纠结抱怨的到底是什么呢?其实就是计算机行业内卷的厉害,对于学历要求,个人背景、技术能力等等要求都比较高,有一些舆论认为计算机行业并不适合普通学生。
但是小蒋认为,在现在的21世纪,又有哪个行业即赚钱又不卷呢???你要享受行业的高薪和未来持续发展的红利,那么你就要有勇气去卷过别人。只要你足够努力,方向正确,那么从事计算机行业也并不是一件很难的事。你努力了,即使真的无法进入阿里、百度、腾讯这样的互联网巨头,无法拿到年薪百万。但是,找一个普通计算机行业的技术岗位应该还不是一件难事吧,至少比一些吃“青春饭”的工作要强很多吧。所以,小蒋个人还是非常看好计算机行业的未来发展和前景的。
既然又快要到求职高峰的时候了,小蒋准备和大家一起来看看关于Java技术的一些大厂的、一些重点的、高频的面试题。这些面试题我们该如何回答,面试题究竟问的重点是什么,咱们一起来从面试官的角度来分析一下?
常见面试题
面试题:“Java中线程有几种实现方式?”
这个在软件工程师的面试当中,是一个常见的一道面试题,不单单是阿里、京东、美团这样的大厂会问到,一些中小厂,外企也都会问到。那对应的岗位一般是初中级开发工程师,当然对于高级岗位,线程也是必须要掌握的一个技能。
咱们来一起看看这道题,java中的线程有几种实现方式?
在面对这个题的时候,大家一定不要纠结“几种”!一种,两种,三种,几种都行!重要的是,把线程的具体实现方式和设计思路说明白!这也是我自己开始做面试的时候才想明白过来的,接下来我具体的和小伙伴们聊一聊。
第一种方式
咱们先来说第一种方式:继承Thread类,重写run()方法。
这种方式比较常见,直接拿到new 出来的Thread对象后,调用start()方法就可以直接执行线程。
这种方式的重点是“继承”。
1. /**
2. * @Author: jiangwei
3. * @Date: 2023/6/21 17:02
4. * @Description:
5. */
6. public class ThreadDemo1 extends Thread {
7.
8. private int i = 0;
9.
10. @Override
11. public void run() {
12. for (i = 0; i < 10; i++) {
13. System.out.println("MyThreadTest " + Thread.currentThread().getName() + " " + i);
14. }
15. }
16.
17. public static void main(String[] args) {
18. ThreadDemo1 threadDemo01 = new ThreadDemo1();
19. threadDemo01.setName("我是自定义的线程1");
20. threadDemo01.start();
21. System.out.println(Thread.currentThread().toString());
22.
23. }24. }
第二种方式
再来说第二种线程实现方式:通过实现Runnable接口并重写他的run()方法。把这个实现类的实例,作为初始化Thread对象时构造函数的参数。
也就是说,我自己实现一个Runnable,让后把这个Runnable对象交给你Thread去执行。
这种接口实现的方式要比继承的方式好一些。因为Java本身就是一种面向对象的编程语言,咱们尝试从语言设计和架构的角度思考。面向对象的精髓就是抽象,最能体现这一点的就是接口。接口是什么?接口就是规范!它的作用就是抽象和实现分离。当一种语言具备了抽象能力比如java、c++、c#等,我们都会研究她的设计模式,因为,实际上设计模式研究的就是如何合理的去抽象对象。
所以,当我们看到有通过继承的方式实现线程,从设计和架构的角度思考,第一反应就是它应该也可以通过实现接口的方式实现“线程”。因为在java中一个类只能继承一个父类,但是一个接口却可以继承多个接口。如果我是架构师,我肯定会通过接口的方式去定义线程对象,这样能够体现程序设计的多态和高内聚低耦合的设计思想。
1. /**
2. * @Author: jiangwei
3. * @Date: 2023/6/25 12:04
4. * @Description:
5. */
6. public class ThreadDemo2 {
7. public static void main(String[] args){
8. System.out.println(Thread.currentThread().getName());
9. Thread t1 = new Thread(new MyThread());
10. t1.start();
11. }
12. }
13.
14. class MyThread implements Runnable{
15. @Override
16. public void run() {
17. // TODO Auto-generated method stub
18. System.out.println(Thread.currentThread().getName()+"-->我是通过实现接口的线程实现方式!");
19. }20. }
第三种方式
第一种实现方式和第二种实现方式,是面向对象的角度出发的。所以有继承和接口这两种方式。接下来,如果你是架构师你来设计,从需求的角度思考,咱们还需要什么能力(Feature)?
第一种和第二种方式,都是通过重写run()方法实现的,它的返回值是void,也就是没有返回值。但是,在现实生产业务中,很多时候是需要返回值的。这时候,需求来了!
我们需要一种可以返回结果的多线程实现方式,这就是第三种,通过Callable和FutureTask的方式创建线程,Java为我们准备好了。
咱们一起看UML图,Callable接口它提供了一个带返回值的call()方法。FutureTask可以理解成是一个可以运行Callable的容器,并且可以获得Callable的返回值。FutureTask他实现了Runnable接口,所以可以和第二种方式一样,当成Thread的参数构建一个线程。
区别就是第二种直接实现Runnable接口的方式没有返回值,通过Callable + FutureTask的这种方式可以获得线程执行完毕的返回结果。多态的特性显得淋漓尽致。

1. /**
2. * @Author: jiangwei
3. * @Date: 2023/6/21 17:22
4. * @Description:
5. */
6. public class ThreadDemo3 {
7.
8. /**
9. * @param args
10. */
11. public static void main(String[] args) {
12. // TODO Auto-generated method stub
13.
14. Callable<Object> oneCallable = new Tickets<Object>();
15. FutureTask<Object> oneTask = new FutureTask<Object>(oneCallable);
16.
17. Thread t = new Thread(oneTask);
18.
19. System.out.println(Thread.currentThread().getName());
20.
21. t.start();
22.
23. }
24.
25. }
26.
27. class Tickets<Object> implements Callable<Object>{
28.
29. //重写call方法
30. @Override
31. public Object call() throws Exception {
32. // TODO Auto-generated method stub
33. System.out.println(Thread.currentThread().getName()+"-->我是通过实现Callable接口通过FutureTask包装器来实现的线程");
34. return null;
35. }
36. }
![]()
总结
面试题中Java有几种线程实现方式,一定不要纠结几种,把线程实现的逻辑说清楚即可。开发中设计思想是核心,无论什么语言,尝试理清逻辑关系和需求,自然就有答案,千万别死记硬背。
线程可以通过继承的Thread方式、接口实现Runnable的方式实现,但是这种方式没有返回值。想要获得返回值,需要使用Callable接口。实现这个接口让你可以得到获得返回值的能力,但是Callable需要通过FutureTask这个容器执行。
当然,另外线程还可以通过线池的方式实现,但是殊途同归。究其底层,其实都是通过Runnable的方式实现的,你直接说一种实现方式也没问题 。
以上这些是小蒋今天分享的内容,更多面试题小蒋会慢慢和大家分享,谢谢大家!
https://m.ximalaya.com/sound/644318088?from=pc

1454

被折叠的 条评论
为什么被折叠?



