多线程面试题有哪些?答案详解

XIAO 2020-03-19 16:02:02 java常见问答 8861

转眼又到了一年中各个软件开发相关企业的招人高峰期啦,在面试过程中多线程问题可是经常被问及的呢,那我们该如何回那些经常被问及的多线程问题呢?

首先呢,我们可以在心里记住下面这张图片:

多线程面试题及答案

对应的问题会有:

1.线程的实现方式,线程的生命周期等。

我们可以按照下面这样一点一点说明:

答:1.线程的生命周期线程是一个动态执行的过程,它也有一个从产生到死亡的过程。

(1)生命周期的五种状态

新建(new Thread)当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。

例如:Thread t1=new Thread();

就绪(runnable)线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源。例如:t1.start();

运行(running)线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。

死亡(dead)

当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。

自然终止:正常运行run()方法后终止

异常终止:调用stop()方法让一个线程终止运行

堵塞(blocked)

由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。

正在睡眠:用sleep(long t) 方法可使线程进入睡眠方式。一个睡眠着的线程在指定的时间过去可进入就绪状态。

正在等待:调用wait()方法。(调用motify()方法回到就绪状态)

被另一个线程所阻塞:调用suspend()方法。(调用resume()方法恢复)

2.线程中常用方法的区别?

线程中最多用到的是start方法,它的作用是用来启动一个线程。(一个Thread类的对象就是一个线程,用这个对象.start()就是启动一个线程)

其次,线程中用的多的就是sleep,join,wait这种会引发InterruptedException异常的方法,

sleep是用来休眠一个线程一段时间,

join是用来强制执行一个线程,

wait这个方法是Object类中的方法,用于等待。

除yield(),礼让的意思就是让另外一个线程执行一会,然后自己再执行,不同于sleep。

还有获得当前线程的对象,这个方法也很重要,currentThread()。

对于线程中,还应了解到线程的死锁的概念,不需要掌握这个概念,但是应该知道可以通过哪些途径避免死锁,java中提供了使用Synchronized关键字和Synchronized同步方法来解决。

3. 多线程和单线程有什么区别?

答:单线程的也就是程序执行时,所跑的程序路径(处理的东西)是连续顺序下来的,必须前面的处理好,后面的彩绘执行到。

多线程嘛,举个例子也就是说程序可以同时执行2个以上相同类似的操作,比如一些搜索代理或者群发email的多线程软件,由于操作一次需要网络的返回信息花的时间比较长,而对cpu来说却是空闲的,如果是一个一个顺序执行,那么搜索几千个IP就会花上好久好久。 而如果用多线程就可以在等待期间 加入其他的搜索,然后等待,这样可以提高效率。

4. 用同步块与同步方法的区别?

答:同步方法就是被synchronized修饰的方法,同步整个方法,且整个方法都会被锁住,同一时间只有一个线程可以访问该方法。整个业务,缺点:性能差

同步块就是使用synchronized修饰的代码块,可以同步一小部分代码

同步块越小性能越好,当性能要求比较高时,用同步块

5. .说说stop为什么不建议使用。

答:stop()方法作为一种粗暴的线程终止行为,在线程终止之前没有对其做任何的清除操作,因此具有固有的不安全性。

6. unable接口的方法是什么?

答:run()

什么是同步和异步,分别用例子说明,同步有几种方式?

同步就是排队去做事情,异步就是各做各的

7. 线程的死锁问题

答:死锁就是当有两个或两个以上的线程都获得对方的资源,但彼此有不肯放开,处于僵持状态,此时便造成了死锁。

条件:两个或两个以上的线程

同时想要获取对方的资源,彼此又不肯放开

8. 线程的四种状态,__、_、_、___。启动调用_方法,启动后会调用__方法。

答:四种状态:新(new) 可执行(runnable)堵塞(blocked)死(dead)

启动调用start 启动后调用run

9. 线程的启动是哪个方法,调用的是哪个方法?

答:start用于启动线程,当调用start后,线程并不会马上运行,而是处于就绪状态,是否要运行取决于cpu给的时间片。

run用于子类重写来实现线程的功能。

我们一般调用的是start方法,系统调用的

是run方法。

10. wait,notify,notifyAll在什么地方使用才有效,他们是那个类的方法

答:wait ,notify , notifyAll都必须在synchronized修饰的方法或synchronized块中使用,都属于Object的方法,可以被所有类继承,都是final修饰的方法,不能通过子类覆写去改变他们的行为。

11. 线程间是什么通信的,通过调用几个方法来交互的

答:线程间是通过相互作用,共同完成一个任务当一个线程调用wait方法后便进入等待状态,需要另一线程调用notify()方法对它进行唤醒。notifyAll可以唤醒所有线程,都必须在synchronized方法或synchronized块里使用

12. 讲下同步方法和同步块的区别,以及什么时候用它们

答:同步方法就是被synchronized修饰的方法,同步整个方法,且整个方法都会被锁住,同一时间只有一个线程可以访问该方法。整个业务,缺点:性能差

同步块就是使用synchronized修饰的代码块,可以同步一小部分代码

同步块越小性能越好,当性能要求比较高时,用同步块。

13.为什么Thread里面的大部分方法都是final的

答: 不能被重写,线程的很多方法都是由系统调用的,不能通过子类覆写去改变他们的行为。

14. 一般的线程优先级是什么回事,线程优先级高的线程一定会先执行吗?如果不设置优先级的话,那么线程优先级是多少,设置线程优先级用那个函数

答:线程的优先级就是设置哪个线程优先执行,但也不是绝对的,只是让优先级高的线程优先运行的几率高一些。线程默认是NORM_PRIORITY = 5; 设置优先级使用的是setPriority()函数。

15. 实现一个线程有哪几种方式,各有什么优缺点,比较常用的是那种,为什么

答案

线程有3种实现方式:

①.通过继承Thread类,优点:可以直接调用start方法启动。缺点:继承一个类后,不能再继承别的类。需要重写run方法。无返回值。

②.实现Runnable接口,优点:可以实现多个接口或继承一个类;缺点:不能直接启动,要通过构造一个Thread把自己传进去。需要重写run方法,无返回值。

③.实现Callable接口,优点:可以抛出异常,有返回值;缺点:只有jkd1.5以后才支持。需要重写call方法。结合FutureTask和Thread类一起使用,最后调用start启动。

一般最常用的是第二种,实现Runnable接口。比较方便,可扩展性高。

总的来说经常会被提交的多线程面试问题不会太难,主要靠理解了之后能比较有条理的回答就没什么大问题了。最后希望各位都能找到自己心仪的工作!想了解更多的相关问题记得关注本站消息。