Java线程面试题(超高频 超详细!!)

目录

1.如何创建线程?哪种好?

2.线程状态

3.一般线程和守护线程的区别

4.sleep wait yield notify notifyAll join详解

一.Sleep 与 wait 区别

二 yield join notify notifyAll

5.中断线程

6. 多线程如何避免死锁

一.什么是死锁?

二.如何确保 N 个线程可以访问 N 个资源同时又不导致死锁?

7 .多线程的好处以及问题

8.线程通信方式

9.线程中抛出异常怎么办


1.如何创建线程?哪种好?

  有 4 种方式可以用来创建线程
1. 继承 Thread
2. 实现 Runnable 接口
3. 应用程序可以使用 Executor 框架来创建线程池
4. 实现 Callable 接口
实现 Runnable 接口比继承 Thread 类所具有的优势
1 ):适合多个相同的程序代码的线程去处理同一个资源
2 ):可以避免 java 中的单继承的限制
3 ):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立
4 ):线程池只能放入实现 Runable 或 callable 类线程,不能直接放入继承 Thread 的类
5 ): runnable 实现线程可以对线 程进行复用,因为 runnable 是轻量级的对象,重复 new 不会耗           费太大资源,而 Thread 则不然,它是重量级对象,而且线程执行完就完了,无法再次利用

2.线程状态

 

1 、新建状态( New ):新创建了一个线程对象。
2 、就绪状态( Runnable ):线程对象创建后,其他线程调用了该对象的 start() 方法。
     该状态的线程位于可运行线程池中,变得可运行,等待获取 CPU 的使用权。
3 、运行状态( Running ):就绪状态的线程获取了 CPU ,执行程序代码。
4 、阻塞状态( Blocked ):阻塞状态是线程因为某种原因放弃 CPU 使用权,暂时停止
     运行。直到线程进入就绪状态,才有机会转到运行状态。
阻塞的情况分三种
(一)、等待阻塞:运行的线程执行 wait() 方法, JVM 会把该线程放入等待池中。 (wait
              会释放持有的锁 )
(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,
              则 JVM 会把该线程放入锁池中。
(三)、其他阻塞:运行的线程执行 sleep() join()
  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值