面试题--4

1.线程有哪些状态?
2.sleep() 和wait() 有什么区别?
3.notify()和 notifyAll()有什么区别?
4.线程的 run() 和 start() 有什么区别?
5.说一说几种常见的线程池及适用场景?

FixedThreadPool: 固定线程池
SingleThreadExecutor:单线程执行器
CachedThreadPool:缓存线程池
ScheduledThreadPool:计划线程池
DelayQueue延迟队列

1.线程有哪些状态?

面试题--4_第1张图片

当线程对象创建后,即进入了新建状态(NEW),;
当调用线程对象的start()方法(t.start();),线程即进入就绪状态(Runnable)
CPU获取到时间片,进入到运行状态(Running);

当线程调用wait()或者sleep()时,进入阻塞状态(Blocked)
当休眠时间结束后,或者调用notify或notifyAll时会重新进入就绪状态(Runnable),
再重新获取时间片,进入运行状态(Running)

线程执行完了或者因异常退出了run()方法,该线程结束生命周期,进入终止状态(Dead)

2.sleep() 和wait() 有什么区别?

类的不同sleep() 来自 Thread,wait() 来自 Object。

释放锁sleep() 不释放锁;wait() 释放锁。

用 法 不 同sleep() 时 间 到 会 自 动 恢 复 ;wait() 可 以 使 用 notify() / notifyAll() 直接唤醒。

3.notify()和 notifyAll()有什么区别?

notify() 唤醒一个线程,notifyAll() 唤醒所有的线程。

notify() 只会唤醒一个线程,具体唤醒哪一个线程 由虚拟机控制。
notifyAll() 调用后,会将全部线程 由 等待池 移到 锁池,然后参与锁的竞争,
竞争成功 则继续执行,不成功 则留在锁池 等待锁被释放后 再次参与竞争。

4.线程的 run() 和 start() 有什么区别?

start() 方法用于启动线程,run() 方法用于执行线程的 运行时代码。
run() 可以 重复调用,而start() 只能 调用一次

5.说一说几种常见的线程池及适用场景?

FixedThreadPool:可重用 固定线程数 的线程池。(适用于负载比较重的服务器)
SingleThreadExecutor:只会创建一个 线程执行任务 的线程池。(适用于需要保证顺序执行各个任务;并且在任意时间点,没有多线程活动的场景。)
CachedThreadPool:是一个会根据需要调整 线程数量的线程池。(大小无界,适用于执行很多的短期异步任务的小程序,或负载较轻的服务器)
ScheduledThreadPool:继承自ThreadPoolExecutor。(它主要用来在 指定的延迟之后 运行任务,或者定期执行任务。使用DelayQueue作为任务队列。)

你可能感兴趣的:(面试题,java,开发语言)