fork download
  1. class Queue {
  2. private String[] buf;
  3. private int messagein = 0; // メッセージがない場合は0、ある場合は1
  4. int start = 0;
  5.  
  6. public Queue(int size) {
  7. buf = new String[size];
  8. }
  9.  
  10. public synchronized void wrtMessage(String str) throws InterruptedException {
  11. while (messagein >= buf.length) { // キューが満杯の場合、待機
  12. wait();
  13. }
  14. int end = (start + messagein) % buf.length; // 書き込み位置を計算
  15. buf[end] = str;
  16. messagein++; // メッセージ数を増加
  17. notifyAll();
  18. }
  19.  
  20. public synchronized String readMessage() throws InterruptedException {
  21. while (messagein == 0) { // キューが空の場合、待機
  22. wait();
  23. }
  24. String mes = buf[start]; // メッセージを取得
  25. start = (start + 1) % buf.length; // 次の読み取り位置を計算
  26. messagein--; // メッセージ数を減少
  27. notifyAll();
  28. return mes;
  29. }
  30. }
  31.  
  32. class Asan implements Runnable {
  33. Queue send_q, recv_q;
  34.  
  35. Asan(Queue send, Queue recv) {
  36. send_q = send;
  37. recv_q = recv;
  38. }
  39.  
  40. public void run() {
  41. try {
  42. // メッセージを送信
  43. send_q.wrtMessage("Bさん,こんにちは.Aより");
  44. send_q.wrtMessage("おなかすいた");
  45. send_q.wrtMessage("カレー食べたい");
  46. send_q.wrtMessage("Bye"); // 終了メッセージを送信
  47.  
  48. // メッセージを受信
  49. String retmes;
  50. while (!(retmes = recv_q.readMessage()).equals("Bye")) {
  51. System.out.println("Asan: Bsanから受信 -> 『" + retmes + "』");
  52. }
  53. System.out.println("Asan: 終了");
  54. } catch (Exception e) {
  55. System.err.println(e.getMessage());
  56. }
  57. }
  58. }
  59.  
  60. class Bsan implements Runnable {
  61. Queue send_q, recv_q;
  62.  
  63. Bsan(Queue send, Queue recv) {
  64. send_q = send;
  65. recv_q = recv;
  66. }
  67.  
  68. public void run() {
  69. try {
  70. String retmes;
  71.  
  72. // メッセージを受信
  73. while (!(retmes = recv_q.readMessage()).equals("Bye")) {
  74. System.out.println("Bsan: Asanから受信 -> 『" + retmes + "』");
  75.  
  76. // 受け取ったメッセージに応じて返信
  77. send_q.wrtMessage("ハヤシライス食べたい");
  78. send_q.wrtMessage("カレーもいいね!");
  79. send_q.wrtMessage("Bye");
  80.  
  81. }
  82. // "Bye"を受け取ったら終了
  83. send_q.wrtMessage("Bye"); // 終了メッセージを送信
  84. System.out.println("Bsan: 終了");
  85. } catch (Exception e) {
  86. System.err.println(e.getMessage());
  87. }
  88. }
  89. }
  90.  
  91. class ideone {
  92. public static void main(String[] args) {
  93. Queue obj1 = new Queue(10); // Asan -> Bsan のキュー
  94. Queue obj2 = new Queue(10); // Bsan -> Asan のキュー
  95.  
  96. Asan sy1 = new Asan(obj1, obj2); // Aさんのインスタンス
  97. Bsan sy2 = new Bsan(obj2, obj1); // Bさんのインスタンス
  98.  
  99. Thread th1 = new Thread(sy1); // Aさんのスレッド
  100. Thread th2 = new Thread(sy2); // Bさんのスレッド
  101.  
  102. th1.start(); // スレッドを開始
  103. th2.start();
  104. }
  105. }
  106.  
Success #stdin #stdout 0.11s 61416KB
stdin
Standard input is empty
stdout
Bsan: Asanから受信 -> 『Bさん,こんにちは.Aより』
Bsan: Asanから受信 -> 『おなかすいた』
Bsan: Asanから受信 -> 『カレー食べたい』
Bsan: 終了
Asan: Bsanから受信 -> 『ハヤシライス食べたい』
Asan: Bsanから受信 -> 『カレーもいいね!』
Asan: 終了