java doc线程关键代码的编写教程
2013-06-07 17:34:06;  来源:网络;  作者:;  评论:0 点击:

java doc线程在使用的时候需要我们不断学习相关问题,下面我们就详细的看看如何才能更好使用相关代码。 wait(),notify(),notifyAll()不属...

java doc线程在使用的时候需要我们不断学习相关问题,下面我们就详细的看看如何才能更好使用相关代码。 wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类,也就是说每个对像都有 wait(),notify(),notifyAll()的功能。

因为都个对像都有锁,锁是每个对像的基础,当然操作锁的方法也是最基础了.

先看java doc线程怎么说:

wait导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。当前的线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行.

notify唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。此方法只应由作为此对象监视器的所有者的线程来调用.

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

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

Java代码

  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.  
  41. public void run() {   
  42. while (true) {   
  43. synchronized (container) {   
  44. if (container.size() > MultiThread.MAX) {   
  45. try {   
  46. container.wait();   
  47. } catch (InterruptedException e) {   
  48. e.printStackTrace();   
  49. }   
  50. }   
  51. try {   
  52. Thread.sleep(100);   
  53. } catch (InterruptedException e) {   
  54. e.printStackTrace();   
  55. }   
  56. container.add(new Object());   
  57. container.notify();   
  58. System.out.println("我生产了"+(++count)+"个");   
  59. }   
  60. }   
  61. }   
  62. }   
  63. package ProductAndConsume;   
  64. import java.util.ArrayList;   
  65. import java.util.List;   
  66. public class MultiThread {   
  67. private List container = new ArrayList();   
  68. public final static int MAX = 5;   
  69. public static void main(String args[]){   
  70. MultiThread m = new MultiThread();   
  71. new Thread(new Consume(m.getContainer())).start();   
  72. new Thread(new Product(m.getContainer())).start();   
  73. new Thread(new Consume(m.getContainer())).start();   
  74. new Thread(new Product(m.getContainer())).start();   
  75. }   
  76. public List getContainer() {   
  77. return container;   
  78. }   
  79. public void setContainer(List container) {   
  80. this.container = container;   
  81. }  

以上就是对java doc线程的相关介绍。希望大家有所收获。

本文属转载文章,并不能保证完全正确,只供学习交流参考,版权归原作者所有。如果您认为有侵犯权利等不和法行为,请联系我们及时改正。http://www.zhuitaiyang.com/html/java/95.html

相关热词搜索:java doc线程 关键

上一篇:Java线程函数关键代码详细讲述
下一篇:关于敏捷开发中如何编写高质量Java代码

收藏
回到顶部