java doc线程关键代码的编写教程

开发 后端
java doc线程需要我们注意重要代码的编写。我们在反复的编写中需要不断的注意相关问题。下面我们就来详细的看看如何才能更好的使用java doc线程。

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

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

先看java doc线程怎么说:

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

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线程的相关介绍。希望大家有所收获。

责任编辑:张浩 来源: IT168
相关推荐

2010-03-16 18:59:15

Java Runnab

2010-03-16 19:46:14

Java线程函数

2010-09-01 11:08:09

CSS

2022-08-02 10:33:11

JavaScript代码

2010-03-18 17:30:46

Java Socket

2010-03-17 09:33:30

Java多线程方案

2010-03-25 17:58:27

2010-03-16 10:32:36

Java线程拨号器

2020-12-28 08:18:55

安全代码线程

2024-05-11 09:41:45

线程安全代码

2010-03-18 15:31:13

Java创建线程

2024-03-20 08:00:00

软件开发Java编程语言

2012-04-27 16:54:57

Java代码

2011-11-25 10:35:20

Java

2012-03-15 13:36:51

云计算JavaSpring框架

2018-01-12 14:37:34

Java代码实践

2011-07-14 11:27:50

java

2019-11-08 09:20:57

代码开发工具

2013-03-22 16:43:03

可读代码代码的艺术代码编写

2012-07-11 10:51:37

编程
点赞
收藏

51CTO技术栈公众号