线程异常面试题

Java中如何停止一个线程?

  • JDK 1.0本来有一些像stop(), suspend() 和 resume()的控制方法但是由于潜在的死锁威胁因此在后续的JDK版本中他们被弃用了

  • 当run() 或者 call() 方法执行完的时候线程会自动结束

  • 可以用volatile 布尔变量来退出run()方法的循环或者是取消任务来中断线程

一个线程运行时发生异常会怎样?

  • 异常没有被捕获该线程将会停止执行

  • 当一个未捕获异常将造成线程中断的时候JVM会使用Thread.getUncaughtExceptionHandler()来查询线程的UncaughtExceptionHandler并将线程和异常作为参数传递给handler的uncaughtException()方法进行处理。

如果同步块内的线程抛出异常会发生什么?

  • 无论你的同步块是正常还是异常退出的,里面的线程都会释放锁

Java中活锁和死锁有什么区别?

  • 处于活锁的线程或进程的状态是不断改变的,活锁可以认为是一种特殊的饥饿

  • 进程的状态可以改变但是却不能继续执行

怎么检测一个线程是否拥有锁?

  • 在java.lang.Thread中有一个方法叫holdsLock(),它返回true如果当且仅当当前线程拥有某个具体对象的锁