前提・実現したいこと
クラスをAsanからBsanへキューを使ってメッセージを送る。
クラスをAsan,Bsanでくりかえしメッセージを送れるようにする。
Aさん,Bさんオブジェクトが,プロキシオブジェクトを介して通信するプログラムを作る。
実現するシーケンスは添付した画像の通りです。
これに
「proxyもAsan,Bsan同様にmainとは別のスレッドで動かす。」
という内容を追加したいのですがいまくいかないので質問させてもらいました。
■■な機能を実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
java
1ソースコード
class Queue {
private String[] buf;
private int messagein = 0;
int start = 0;
public Queue(int size) { // 指定されたサイズでバッファを確保 buf = new String[size]; } public synchronized void writeMessage(String str) throws InterruptedException { // すでにメッセージがある場合 while (messagein >= buf.length) { // notifyされるまで待機 wait(); } int end = (start + messagein) % buf.length; buf[end] = str; // メッセージが入った messagein++; notifyAll(); } public synchronized String readMessage() throws InterruptedException { // メッセージが入るまで待つ while (messagein == 0) { // notifyされるまで待機 wait(); } String message = buf[start]; start = (start + 1) % buf.length; // メッセージがなくなった messagein--; notifyAll(); return message; }
}
class Proxy {
Queue[] queue = new Queue[3];
public Proxy() { queue[0] = new Queue(10); queue[1] = new Queue(10); queue[2] = new Queue(10); } public void send(String source, String message) { try { if (source.equals("Aさん")) { queue[1].writeMessage(message); queue[0].writeMessage("100 Trying"); } else { queue[0].writeMessage(message); } } catch (Exception e) { System.err.println(e.getMessage()); } } public String recv(String source) { String ret = new String(); try { if (source.equals("Aさん")) { ret = queue[0].readMessage(); } else { ret = queue[1].readMessage(); } } catch (Exception e) { System.err.println(e); } return ret; }
}
class Asan implements Runnable {
Proxy proxy;
String name = "Aさん";
Asan(Proxy proxy) { this.proxy = proxy; } public void run() { try { String message = "INVITE"; System.out.println(name + " send: " + message); proxy.send(name, message); Thread.sleep(1000); System.out.println(name + " recv: " + proxy.recv(name)); Thread.sleep(1000); System.out.println(name + " recv: " + proxy.recv(name)); Thread.sleep(5000); System.out.println(name + " recv: " + proxy.recv(name)); } catch (Exception e) { System.err.println(e.getMessage()); } }
}
class Bsan implements Runnable {
Proxy proxy;
String name = "Bさん";
Bsan(Proxy proxy) { this.proxy = proxy; } public void run() { try { Thread.sleep(1000); System.out.println(name + " recv: " + proxy.recv(name)); Thread.sleep(1000); String message = "180 Ringing"; System.out.println(name + " send: " + message); proxy.send(name, message); Thread.sleep(3000); message = "200 OK"; System.out.println(name + " send: " + message); proxy.send(name, message); } catch (Exception e) { System.err.println(e.getMessage()); } }
}
public class Main {
public static void main(String args[]) {
Proxy proxy = new Proxy();
Asan sy1 = new Asan(proxy); Bsan sy2 = new Bsan(proxy); Thread th1 = new Thread(sy1); Thread th2 = new Thread(sy2); th1.start(); th2.start(); }
}
試したこと
できた内容はソースコードのところまでです。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー