我需要創建一個echo-echo請求的字符串的echo服務器。一個線程(Client)調用echo方法來提交要回顯的字符串(所有echo方法實際上都是將字符串放在作業隊列中),然後一個單獨的線程從隊列中取出字符串並將它們輸出到屏幕。Java多線程同步
步驟之一是使隊列靜態的,以便它在線程之間共享,我只需簡單地更換這樣做:
public final Queue<String> requests = new LinkedList<String>();
用(不知道是否正確)
public static Queue<String> requests = new LinkedList<String>();
在此代碼:
public class EchoServer implements Runnable {
//make queue a static object
//public final Queue<String> requests = new LinkedList<String>();
public static Queue<String> requests = new LinkedList<String>();
public EchoServer() {
new Thread(this).start();
}
//all echo does is place the string in the job queue
public void echo(String s) {
requests.add(s);
}
public void run() {
for(;;) realEcho(requests.remove());
//synchronized here?
}
private void realEcho(String s) {
// do the real work of echo-printing
}
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName());
EchoServer r1 = new EchoServer();
r1.echo("HEY");
Thread t1 = new Thread(r1, "manager");
t1.start();
EchoServer r2 = new EchoServer();
r2.echo("HI");
Thread t2 = new Thread(r2, "client");
t2.start();
}
}
現在我的問題(除了「NoSuchElement」異常,這是因爲每個線程都嘗試從請求隊列中刪除元素而不添加任何內容)是我需要照顧同步問題,因爲隊列是在多個線程之間共享的。試圖找出同步時我很迷茫。有沒有人有一些提示可以幫助我?任何幫助表示讚賞!
+1'BlockingQueue'(它不是'ConcurrentBlockingQueue' BTW)。一個簡單的實現是使用'LinkedBlockingQueue'。 – Gray
謝謝!這非常有幫助!我有一個錯誤:'找不到符號 符號:方法isInterrupted()' 我必須包括任何東西才能使此函數工作? – user2125844
@ user2125844'isInterrupted()'是一個來自'java.lang.Thread'的方法;我的代碼擴展了'Thread',而不是'Runnable'。 – AJMansfield