【温故而知新】Java中线程的实现方式!

时间:2023年06月27日

作者:小蒋聊技术

邮箱:wei_wei10@163.com

微信:wei_wei10

【音频】【温故而知新】Java中线程的实现方式!_小蒋聊技术_免费在线阅读收听下载 - 喜马拉雅手机版欢迎收听小蒋聊技术的其他类最新章节声音“【温故而知新】Java中线程的实现方式!”。大家好,欢迎来到小蒋聊技术。小蒋准备和大家一起聊聊技术的那些事。文字版材料在CSDN博客,“小蒋聊技术”的同名文章里。文字版地...icon-default.png?t=N5K3https://m.ximalaya.com/sound/644318088?from=pc

前言

        大家好,欢迎来到小蒋聊技术,小蒋准备和大家一起聊聊技术的那些事。

        大家常说金九银十毕业季,又是毕业生求职的好时机。虽然最近几年计算机行业不那么景气,但是为什么还是有大量人想要加入?想要求职的进入计算机行业的小伙伴们,大家千万不要被网上的只言片语、悲观情绪所左右,一定要有自己的思考和判断。

         小蒋带着大家换一个角度来看看,每年行业平均从业人员数量和人员的平均工资的排行,你会发现计算机行业的就业机会和工资排名远远超过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,也就是没有返回值。但是,在现实生产业务中,很多时候是需要返回值的。这时候,需求来了!

        我们需要一种可以返回结果的多线程实现方式,这就是第三种,通过CallableFutureTask的方式创建线程,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的方式实现的,你直接说一种实现方式也没问题 。

      

        以上这些是小蒋今天分享的内容,更多面试题小蒋会慢慢和大家分享,谢谢大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蒋聊技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值