首页 > 编程知识 正文

java多线程有哪几种实现方式(Java多线程实现的四种方式)

时间:2023-05-03 05:44:05 阅读:77589 作者:93

昨天,有一个同伴给蚂蚁面试实习生工作。 面试官问了他过去常说的问题。 你说Java做线程有什么方法?

这个ladbbz心里窃喜,这个老生常谈的问题我早就背熟了,所以说得很流利。

在Java中创建线程有两种方法。

继承Thread类并重写run ) )方法

2 .实现runnable接口,覆盖接口中的run ()方法,将runnable接口的实现提交给Thread

面试官:(拿出白纸)那就写一下这两种方式吧!

哥哥:)这有什么难的! 是的~

publicstaticvoidmain (字符串[ ] args )//第一类MyThreadmyThread=newMyThread ); myThread.start (; //第二类newThread ()-System.out.println ) '自己实现的run-2 ' ) ).start ); } publicstaticclassmythreadextendsthread { @ overridepublicvoidrun ((system.out.println (自己实现的run-1 ) ); }

面试官:嗯,那除了这两个以外,还有其他制作线程的方法吗?

因为这些简单的问题很难打败这个ladbbz,所以我考虑了Java5以后的执行。 Executors工具类可用于创建线程池。

哥哥: Executors工具类用于创建线程池。 此线程池可以指定线程数,也可以不指定线程数。 也可以指定计时器的线程池。 常用方法如下:

newfixedthreadpool(intnthreads ) :创建固定数量的线程池

newCachedThreadPool (:创建缓存线程池

newSingleThreadExecutor (:创建单个线程

newscheduledthreadpool (intcorepoolsize ) :创建计时器线程池

面试官:嗯,OK,我们还是对你写的代码,再问一次。

这个时候,这个ladbbz有不祥的预感。 自己代码的写法是不是有点问题? 还是问我实现下层?

面试官:你写的两个线程的创建方法与run (方法有关。 你知道Thread的run )方法具体是怎么实现的吗?

果然问了源代码,这个ladbbz之前看了一点,所以没怎么慌张。 想起来了,对面试官说。

哥哥: emm……Thread的run ) )因为方法很少,所以对一个if进行判断。

@Overridepublicvoidrun () if(target!=null () {target.run ); }

一个target对象确定该变量是否为空。 如果不为空,则执行target对象中的run ()方法。 否则,我什么都不做。 这个target对象是我们所说的Runnable :

/* whatwillberun.*/privaterunnabletarget;

面试官:嗯,那你知道这个Runnable类吗? 哥哥:我知道了。 这个Runnable类很简单。 是抽象的方法。

@ functionalinterfacepublicinterfacerunnable { publicabstractvoidrun (; }

这个抽象方法也是run ()! 如果使用Runnable接口,则必须实现此run ()方法。 此Runnable类具有@FunctionalInterface注释,因此可以使用函数式编程。

哥哥继续这样说。 因为“突然变得有自信了”,所以这对应于刚才提到的创建线程的两种方法。 如果我使用第一种方法,继承Thread类,然后重写run ) )方法,则上面的默认run ) )方法不执行,也就是说,不确定target,而是重写的run )方法的

如果我在使用第二种方法,则以实现Runnable接口的方式运行默认的run (运行方法,确定target不为空,然后在Runnable接口上实现的run ) )方法

面试官: OK,可以。 我再问你问题。

哥哥:(暗自高兴) )

面试官:那么,如果我继承了Thread类,同时实现了Runnable接口,比如说,最后打印什么信息?

面试官一边说,一边拿起刚才这个哥哥写的代码,简单地修改了一下:

publicstaticvoidmain (string [ ] args ) {newThread ) (-system.out.println ) @overridepublicvooidmain ) ) overidepubld }

这个哥哥,突然什么都不知道,好像没想过这个问题,暂时没有任何想法,会打印“Thread run”吧……回答。

面试官:答案是正确的,但为什么呢?

这位哥哥没有马上考虑原因,面试官让他能回去考虑,继续下一个问题。

亲爱的读者朋友,你知道为什么吗? 请先想想。

其实这个答案很简单。 分析一下代码就知道了。 实际上,new继承了对象(子对象) (Thread对象) (父对象),并在子对象中重写了父类的run )方法。 然后,向父对象中扔了Runnable。 父对象的run ) )方法是第一个if判断的run ) )方法。

那么,现在运行start () ()后,必须在子类中查找并找到run ) )方法。 父类的run ) )方法会被自然杀死,因此会打印为Thread run。

现在,假设子类中没有重写run ) )方法,则必须去查找父类中的run ) )方法,并确定父类中的run ) )方法中是否包含Runnable。 因为现在有一个,所以Runnable的run ) )方法会打印出来。 运行nable运行。

说白了,你只需要听听Java语言本身的父子继承关系,优先执行子类的重写方法。 只是,即使借用这个场景,改变提问的方式,面试者可能也不会马上做出反应。 有点无知也很正常。 直接问的话,笨蛋就能回答。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。