Java notify唤醒源代码的经典讲例

开发 后端
Java notify唤醒在使用中如何才能更好的在使用中找到自己的地位?这就需要我们不断的学习相关的源代码。下面我们就来详细的了解。

Java notify唤醒在此对象监视器上等待的单个线程。相关的问题需要我们不断的学习,下面我们就看看如何才能更好的使用。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。

直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。此方法只应由作为此对象监视器的所有者的线程来调用.

"当前的线程必须拥有此对象监视器"与"此方法只应由作为此对象监视器的所有者的线程来调用"说明wait方法与notify方法必须在同步块内执行,即synchronized(obj之内).

调用对像wait方法后,当前线程释放对像锁,进入等待状态.直到其他线程(也只能是其他线程)通过Java notify唤醒方法,或 notifyAll.该线程重新获得对像锁.
继续执行,记得线程必须重新获得对像锁才能继续执行.因为synchronized代码块内没有锁是寸步不能走的.看一个很经典的例子:

 

Java notify唤醒代码

  1. package ProductAndConsume;   
  2. import java.util.List;   
  3. public class Consume implements Runnable{   
  4. private List container = null;   
  5. private int count;   
  6. public Consume(List lst){   
  7. this.container = lst;   
  8. }   
  9. public void run() {   
  10. while(true){   
  11. synchronized (container) {   
  12. if(container.size()== 0){   
  13. try {   
  14. container.wait();//放弃锁   
  15. } catch (InterruptedException e) {   
  16. e.printStackTrace();   
  17. }   
  18. }   
  19. try {   
  20. Thread.sleep(100);   
  21. } catch (InterruptedException e) {   
  22. // TODO Auto-generated catch block   
  23. e.printStackTrace();   
  24. }   
  25. container.remove(0);   
  26. container.notify();   
  27. System.out.println("我吃了"+(++count)+"个");   
  28. }   
  29. }   
  30. }   
  31. }   
  32. package ProductAndConsume;   
  33. import java.util.List;   
  34. public class Product implements Runnable {   
  35. private List container = null;   
  36. private int count;   
  37. public Product(List lst) {   
  38. this.container = lst;   
  39. }   
  40. public void run() {   
  41. while (true) {   
  42. synchronized (container) {   
  43. if (container.size() > MultiThread.MAX) {   
  44. try {   
  45. container.wait();   
  46. } catch (InterruptedException e) {   
  47. e.printStackTrace();   
  48. }   
  49. }   
  50. try {   
  51. Thread.sleep(100);   
  52. } catch (InterruptedException e) {   
  53. e.printStackTrace();   
  54. }   
  55. container.add(new Object());   
  56. container.notify();   
  57. System.out.println("我生产了"+(++count)+"个");   
  58. }   
  59. }   
  60. }   
  61. }   
  62. package ProductAndConsume;   
  63. import java.util.ArrayList;   
  64. import java.util.List;   
  65. public class MultiThread {   
  66. private List container = new ArrayList();   
  67. public final static int MAX = 5;   
  68. public static void main(String args[]){   
  69. MultiThread m = new MultiThread();   
  70. new Thread(new Consume(m.getContainer())).start();   
  71. new Thread(new Product(m.getContainer())).start();   
  72. new Thread(new Consume(m.getContainer())).start();   
  73. new Thread(new Product(m.getContainer())).start();   
  74. }   
  75. public List getContainer() {   
  76. return container;   
  77. }   
  78. public void setContainer(List container) {   
  79. this.container = container;   
  80. }  

以上就是对Java notify唤醒相关代码的介绍。希望大家有所帮助。

【编辑推荐】

  1. Java多线程进程应对同一程序运行资源
  2. Java多线程方案如何处理关键代码
  3. Java多线程操作相关问题总结
  4. Java多线程循环相关的代码介绍
  5. Java多线程静态数据如何进行数据同步
责任编辑:张浩 来源: 博客园
相关推荐

2022-04-20 07:47:00

notify唤醒线程JVM

2019-03-12 11:11:25

开源Leveldb存储

2011-04-22 10:43:37

JavaScript

2011-05-18 10:52:51

java编码规范

2020-11-13 13:05:27

Java开发代码

2011-12-15 10:10:33

Javanio

2010-03-19 16:51:53

Java Socket

2009-04-03 08:28:39

2010-03-18 14:46:18

Java SynDem

2010-03-17 19:06:59

Java join线程

2010-04-29 12:57:33

Unix源代码

2010-08-03 10:16:52

Flex源代码

2009-06-12 19:03:41

Hadoop源代码Yahoo

2016-10-11 16:28:11

源代码

2023-12-05 13:46:09

解密协程线程队列

2009-06-22 13:41:00

Java开放源代码Sun

2010-03-17 17:11:04

Java线程通信

2010-03-19 15:02:50

Java Socket

2011-08-02 10:13:30

Java工具

2009-03-11 11:32:10

JavaJava安全加密技术
点赞
收藏

51CTO技术栈公众号