动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

最常考java多线程的面试题(附答案)

06-11 17:10 849浏览
举报 T字号
  • 大字
  • 中字
  • 小字

今天整理总结了关于java多线程的面试题,把答案一并附上供大家学习参考,话不多说,一起来看看吧。

1、多线程有什么优点?

答:发挥多核CPU的优势;防止阻塞;便于建模。

2、创建线程的方式有什么?

答:一般有两种(1)继承Thread类(2)实现Runnable接口。至于哪个好,不用说肯定是后者好,因为实现接口的方式比继承类的方式更灵活,也能减少程序之间的耦合度,面向接口编程也是设计模式6大原则的核心。

3、什么是线程安全?

答:(1)不可变:像String、Integer、Long这些,都是final类型的类,任何一个线程都改变不了它们的值,要改变除非新创建一个,因此这些不可变对象不需要任何同步手段就可以直接在多线程环境下使用;(2)绝对线程安全:不管运行时环境如何,调用者都不需要额外的同步措施。要做到这一点通常需要付出许多额外的代价,Java中标注自己是线程安全的类,实际上绝大多数都不是线程安全的,不过绝对线程安全的类;(3)相对线程安全:相对线程安全也就是我们通常意义上所说的线程安全,像Vector这种,add、remove方法都是原子操作,不会被打断;(4)线程非安全:ArrayList、LinkedList、HashMap等都是线程非安全的类。

4、一个线程如果出现了运行时异常会怎么样?

答:如果这个异常没有被捕获的话,这个线程就停止执行了。另外重要的一点是:如果这个线程持有某个某个对象的监视器,那么这个对象监视器会被立即释放

5、怎么样在两个线程之间共享数据?

答:通过在线程之间共享对象就可以了,然后通过wait/notify/notifyAll、await/signal/signalAll进行唤起和等待,比方说阻塞队列Blocking Queue就是为线程之间共享数据而设计的。

6、sleep方法和wait方法有什么区别?

答:sleep方法和wait方法都可以用来放弃CPU一定的时间,不同点在于如果线程持有某个对象的监视器,sleep方法不会放弃这个对象的监视器,wait方法放弃这个对象的监视器。

7、生产者消费者模型的作用是什么?

答:(1)通过平衡生产者的生产能力和消费者的消费能力来提升整个系统的运行效率,这是生产者消费者模型最重要的作用;(2)解耦,这是生产者消费者模型附带的作用,解耦意味着生产者和消费者之间的联系少,联系越少越可以独自发展而不需要收到相互的制约。

8、在实际开发中用过多线程吗,具体怎么用的,解决什么问题?

答:通常在后台执行定时任务的时候会用到多线程,例如在P2P项目中给用户回款的时候,数据量比较大,收益需要在指定的时间之前全部返还,不然客户这边投诉的电话就来了,当时我们使用了JUC包下的Executor线程池,启动多线程跑数据。这样问题就解决了。

9、线程之间如何共享数据?

答:(1)多个线程对共享数据的操作是相同的,那么创建一个Runnable的子类对象,将这个对象作为参数传递给Thread的构造方法,此时因为多个线程操作的是同一个Runnable的子类对象,所以他们操作的是同一个共享数据。比如:买票系统,所以的线程的操作都是对票数减一的操作;(2)多个线程对共享数据的操作是不同的,将共享数据和操作共享数据的方法放在同一对象中,将这个对象作为参数传递给Runnable的子类,在子类中用该对象的方法对共享数据进行操作。比如实现生产者和消费者模型;(3)多个线程对共享数据的操作是不同的, 用内部类的方式去实现,创建Runnable的子类作为内部类,将共享对象作为全局变量,在Runnable的子类中对共享数据进行操作。

10、线程的start()和run()方法的区别?

答:start()方法表示启动一个新的线程,在JVM内存中会开启一个新的栈空间。而run()方法只是普通方法调用,不会启动新的线程。

11、实现线程的方式分别是什么?

答:第一种是继承Thread;第二种是实现Runnable接口,这种方式使用较多,面向接口编程一直是被推崇的开发原则;第三种是实现Callable接口用来实现返回结果的线程。

12、怎么获取线程的返回值?

答:使用Executor Service、Callable、Future实现有返回结果的线程。可返回值的任务必须实现Callable接口。执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了。get方法是阻塞的,即:线程无返回结果,get方法就会一直等待。再结合线程池接口Executor Service就可以实现有返回结果的多线程了。

13、怎么唤醒一个阻塞的线程?

答:如果线程是因为调用了wait()、sleep()或者join()方法而导致的阻塞,可以中断线程,并且通过抛出Interrupted Exception来唤醒它;如果线程遇到了IO阻塞,无能为力,因为IO是操作系统实现的,java代码并没有办法直接接触到操作系统。

14、Java中如何获取到线程dump文件?

答:当程序遇到死循环、死锁、阻塞、页面打开慢等问题,查看dump信息是最好的解决问题的途径。线程dump也就是线程堆栈信息。

获取到线程堆栈dump文件内容分两步:第一步:获取到线程的pid,Linux环境下可以使用ps -ef | grep java;第二步:打印线程堆栈,可以通过使用jstack pid命令。

15、不可变对象对多线程有什么帮助?

答:不可变对象保证了对象的内存可见性,对不可变对象的读取不需要进行额外的同步手段,提升了代码执行效率。

15道java多线程面试题肯定不是全部,各大公司的面试题库是在实时更新的,但是以上的题目都是最常见常考的中规中矩的题目,希望对各位java程序员有所帮助。学有余力的朋友们还可以来蛙课网学习多线程的系列课程,一次性搞明白多线程,提升自身技术能力与价值。

0人推荐
共同学习,写下你的评论
0条评论
敲代码的小码农
程序员敲代码的小码农

6篇文章贡献31491字

作者相关文章更多>

推荐相关文章更多>

Java数据结构

HelloWorld10-31 08:24

浅谈MySQL中SQL优化的常用方法

军哥08-12 23:29

五分钟读懂UML类图

江湖人称小李白12-10 10:41

MyBatis开发框架的四大核心

IT逐梦者08-17 21:43

一次搞定continue,break和return

HelloWorld11-06 11:19

发评论

举报

0/150

取消