今日整理总结了有关情况java多线程面试题,把答案附在一起供大家学习参考,话不多说,一起来看看。
1、多线程的优点是什么?
答:发挥多核CPU的优点;防止堵塞;建模方便。
2、创建线程的方法是什么?
答:一般有两种(1)继承Thread类(2)实现Runnable接口。至于哪个好,不用说后者肯定好,因为实现接口的方式比继承更灵活,可以减少程序之间的耦合,面向接口编程也是设计模式六大原则的核心。
3、线程安全是什么?
答:(1)不可变:像String一样、Integer、Long是final类型,任何线程都不能改变它们的值。除非创建了一个新的,否则这些不可改变的对象可以直接在多线程环境中使用,而无需任何同步手段;(2)绝对线程安全:无论运行环境如何,调用器都不需要额外的同步措施。要做到这一点,通常需要付出很多额外的代价。Java标记为线程安全。事实上,绝大多数不是线程安全,而是绝对线程安全;(3)相对线程安全:相对线程安全,即我们通常所说的线程安全,如Vector,add、remove方法都是原子操作,(4)线程不安全:ArrayList、LinkedList、Hashmap等都是线程不安全的类别。
4、如果一个线程运行异常会发生什么?
答:如果这种异常没有被捕获,则该线程将停止执行。另一个重要的一点是,如果该线程持有某个对象的监视器,则该对象的监视器将立即释放
5、如何在两个线程之间共享数据?
答:可以在线程之间共享对象,然后通过wait/notify/notifyAll、await/signal/signalalll被唤醒和等待,例如阻塞队列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()方法引起的阻塞可以中断线程,并抛出Interupted Exception唤醒它;如果线程遇到IO阻塞,无能为力,因为IO是由操作系统实现的,java代码无法直接接触操作系统。
14、如何在Java中获得线程dump文件?
答:当程序遇到死循环、死锁、堵塞、页面打开缓慢等问题时,检查dump信息是解决问题的最佳方法。线程dump是线程堆栈信息。
获取线程堆栈dump文件的内容分为两个步骤:第一步:获取线程pid,ps可用于Linux环境 -ef | grep java;第二步:用jstack打印线程堆栈 pid命令。
15、不可变对象对多线程有什么帮助?
答:不可变对象保证了对象的内存可见性,不需要额外的同步手段来读取不可变对象,提高了代码执行效率。
这15个java多线程面试问题当然不是全部,主要公司的面试问题库是实时更新的,但上述问题是最常见的常规问题,我希望你java程序员有帮助。有余力学习的朋友也可以来蛙课网学习多线程系列课程,一次性了解多线程,提高自己的技术能力和价值。