线程有哪几种状态?
- 新建状态
- 可运行状态
- 阻塞状态(等待cpu时间片,也可能在运行状态)
- 无限期等待状态
进入方法 | 退出方法 |
---|---|
没有设置 Timeout 参数的 Object.wait() 方法 | Object.notify() / Object.notifyAll() |
没有设置 Timeout 参数的 Thread.join() 方法 | 被调用的线程执行完毕 |
LockSupport.park() 方法 |
- 限期等待状态
进入方法 | 退出方法 |
---|---|
Thread.sleep() 方法 | 时间结束 |
设置了 Timeout 参数的 Object.wait() 方法 | 时间结束 / Object.notify() / Object.notifyAll() |
设置了 Timeout 参数的 Thread.join() 方法 | 时间结束 / 被调用的线程执行完毕 |
LockSupport.parkNanos() | - |
LockSupport.parkUntil() | - |
- 死亡状态(线程结束,发生异常而结束)
分别说明从一种状态到另一种状态转变有哪些方式?
通常线程有哪几种使用方式?
- 实现Runable方法(实现run方法)
- 实现Callable方法(有返回值)
- 继承Thread类 (重写run方法)
基础线程机制有哪些?
- Excutor
- 管理多个异步任务的执行,而无需程序员显示的管理线程的生命周期,这的异步指多个任务的执行互不干扰
- Daemon
- 守护线程是程序运行时在后台服务的线程,不属于程序中不可或缺的部分
- sleep() 会休眠当前正在执行的线程
- yield() 会建议优先运行当前线程
线程的中断方式有哪些?
- 调用interrupt()方法,如果该线程处于阻塞或者无限期等待,限期等待中就会抛出异常,从而提前结束该线程,但是这个方法不能中断I/O阻塞,和synchronize锁阻塞
- interrupted()方法可以检测当前执行中的线程是否为中断状态,但是并未中断,此时就可以提前结束线程
- excutor.shutdown()方法相当于调用了每个线程的interrupt方法
线程的互斥同步方式有哪些?
- 基于JVM的synchronize
- 基于JDK实现的Reentrantlock
如何比较和选择?
除非需要使用 ReentrantLock 的高级功能,否则优先使用 synchronized。这是因为 synchronized 是 JVM 实现的一种锁机制,JVM 原生地支持它,而 ReentrantLock 不是所有的 JDK 版本都支持。并且使用 synchronized 不用担心没有释放锁而导致死锁问题,因为 JVM 会确保锁的释放。
线程之间有哪些协作方式?
- join() 方法
在当前线程调用另一线程的join方法时,当前线程会等待另一线程执行完毕才会执行当前线程 - wait(),notify(),notifyAll()
- wait()挂起期间,线程会释放锁,让其它的线程进入执行状态,若是没有释放锁,就无法执行notify 或者 notifyall’方法唤醒挂起的线程,从而造成死锁
- sleep() 方法则不会释放锁
- await() signal() signalAll()
- 该方法同上 只是更加灵活