我对阅读器/书写器实现有问题。我应该编写一个Reader类,该类从控制台获取一个String并将其添加到队列中,而Writer类使用一个Threads从同一队列中删除该String并将其输出到控制台上。我只为一个字符串编写了程序(输入一个字符串,它通过队列输出该字符串),并且运行良好。现在,我正在努力使它能够输入多个字符串,按Enter键,然后Reader将其添加到队列中,然后Writer将其显示。如果键入了字符串“ quit”,则两个线程都必须停止并且程序应结束。
我的读者的主意如下:
Scanner k = new Scanner(System.in);
in = k.nextLine();
if(in.equals("quit"))
System.exit(0);
synchronized(q){
while(!(in.equals("quit"))){
// System.out.println(q.isEmpty());
q.enqueue(in);
in = k.next();
if(in.equals("quit"))
System.exit(0);
}
}
我的作家看起来像这样:
public void run(){
synchronized(q){
while(!q.isEmpty()){
String out = q.dequeue();
System.out.println(out);
}
}
}
我的阅读器似乎工作正常,因为我在添加到队列后内置了Sys.out.(q.isEmpty)
。它向我显示队列已满,但是Writer类没有任何内容输出到控制台。写入quit
会毫无问题地停止程序。
我认为我不太了解线程。我的主要方法只是使用Thread t1 = new Thread(new Reader(queue));
创建线程,并为Writer
创建线程,然后启动两个线程。
synchronized(q){
while(!(in.equals("quit"))){
// System.out.println(q.isEmpty());
q.enqueue(in);
in = k.next();
if(in.equals("quit"))
System.exit(0);
}
}
此同步块太大。通常,您想要同步的时间越短越好。进进出出。同步时间越长,其他线程被阻塞的时间就越长。
同步时执行用户输入是不行的。其他线程不应被阻止,因为用户使用的是慢速打字机。
更糟糕的是,您已经在同步块内找到了整个程序的循环。不好的读者!如此贪婪。在用户输入所有输入并键入“ quit”之前,它不会放弃q
锁定。只有这样,它才会释放锁,并允许编写器继续操作。
while(!(in.equals("quit"))){
// System.out.println(q.isEmpty());
synchronized(q){
q.enqueue(in);
}
in = k.next();
if(in.equals("quit"))
System.exit(0);
}