java线程唤醒
1. java线程的六种状态
Java线程的运行状态包括六种,分别是初始状态(NEW)、就绪状态(RUNNABLE之READY)、运行中状态(RUNNABLE之RUNNING)、阻塞状态(BLOCKED)、等待状态(WAITING)、超时等待状态(TIMED_WAITING)与终止状态(TERMINATED)。
当实现Runnable接口或继承Thread类,并new一个实例,线程即进入初始状态。线程调度程序从可运行池中选择一个线程作为当前线程时,线程进入就绪状态。就绪状态的线程通过线程调度程序的调度进入运行状态。
阻塞状态是指线程在获取synchronized关键字修饰的方法或代码块锁时的状态,此时线程暂停执行,直到获得锁后恢复执行。
等待状态的线程不再分配CPU执行时间,需被显式唤醒,否则可能无限等待。超时等待状态的线程同样不分配CPU执行时间,但会在达到指定时间后自动唤醒。
运行至终止状态的线程,run()方法完成或主线程的main()方法结束,线程终止。终止状态的线程调用start()方法会引发异常。线程一旦终止,无法复生。
在了解线程状态的基础上,深入学习等待队列、同步队列状态及线程方法的比较,有助于更全面地掌握Java并发编程。
推荐阅读:探讨Java线程状态的不同观点,了解Java并发宝典,掌握Volatile关键字在面试中的应用技巧。
2. java中notify怎么使用
notify(),notifyAll()都是要唤醒正在等待的线程,前者明确唤醒一个,后者唤醒全部。
当程序不明确知道下一个要唤醒的线程时,需要采用notifyAll()唤醒所有在wait池中的线程,让它们竞争而获取资源的执行权,但使用notifyAll()时,会出现死锁的风险,因此,如果程序中明确知道下一个要唤醒的线程时,尽可能使用notify()而非notifyAll()。