歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Java 多線性讀者寫者問題

Java 多線性讀者寫者問題

日期:2017/3/1 11:09:30   编辑:Linux編程

Java 多線性讀者寫者問題

  1. package namespace;
  2. class Man
  3. {
  4. String name;
  5. String sex;
  6. boolean flag=false;// 定義一個開關變量,用來進行讀或寫的操作
  7. }
  8. class Input implements Runnable
  9. {
  10. private Man man;
  11. private static int num=1;//用於控制兩次寫進去的值不一樣 
  12. public Input(Man m)
  13. {
  14. this.man=m;
  15. }
  16. public void run()
  17. {
  18. while(true)
  19. {
  20. synchronized(man) {
  21. if(man.flag)//如果flag=true的話,就代表已經寫進去值了,所以就要等待
  22. try { man.wait();}catch(Exception e) {}
  23. if(num==1)//等待被喚醒之後,下面就要對其進行寫的操作了
  24. {
  25. man.name="mike";
  26. man.sex="男";
  27. }else {
  28. man.name="Lily";
  29. man.sex="女";
  30. }
  31. //上面是已經執行完寫的動作
  32. man.flag=true;//寫完之後,要把flag設置成true ,這代表已經寫完,等被讀,如果再執行寫操作的話,上面flag=true ,就開始了等待了
  33. num=(num+1)%2;
  34. man.notify();//
  35. }
  36. }
  37. }
  38. }
  39. class Output implements Runnable
  40. {
  41. private Man man;
  42. public Output(Man m)
  43. {
  44. this.man=m;
  45. }
  46. public void run()
  47. {
  48. while(true)
  49. {
  50. synchronized(man)
  51. {
  52. if(!man.flag)
  53. try { man.wait();}catch(Exception e) {}
  54. System.out.println(man.name+"...."+man.sex);
  55. man.flag=false;
  56. man.notify();
  57. }
  58. }
  59. }
  60. }
  61. public class Study
  62. {
  63. public static void main(String args[])
  64. {
  65. Man man=new Man();
  66. Thread t1=new Thread(new Input(man));
  67. Thread t2=new Thread(new Output(man));
  68. t1.start();
  69. t2.start();
  70. }
  71. }
  72. /*
  73. * 多線程讀者寫者問題
  74. * 線程之間的通信一般都是一段共享數據的操作來進行通信的
  75. *
  76. * 裡面的兩個線程就是一個讀一個寫,然而這兩個操作是通過兩個線程同時進行的.因此如果線程不同步,將會出現安全性問題
  77. * 所謂的安全性問題就是線和寫和線和讀的結果不一樣,出就是讀出來的值並不是寫進行的那樣,這樣就出來了安全性問題
  78. *問題的解決:
  79. * 出現這種同時操作一個對象的問題,就是把它們操作那個對象的代碼進行同步
  80. * 讀者與寫者的問題要考慮到兩個方面:
  81. * 1. 讀和寫的兩個線程要同步
  82. * 2. 讀和寫要寫進去一個就讀一個
  83. *
  84. *
  85. *
  86. * */
  87. /* 2011/10/23 21:22:20
  88. * */
Copyright © Linux教程網 All Rights Reserved