Java-线程面试题

多线程的优点是什么?

答:发挥多核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、不可变对象对多线程有什么帮助?

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

16、进程和线程

进程是系统自愿分配的最小单位

线程是程序执行的最小单位

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值