我需要创建一个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