我的Reader / Writer实现存在问题。我应该编写一个Reader类,该类从控制台获取一个String并将其添加到队列中,而Writer类使用一个Threads从同一队列中删除该String并将其输出到控制台上。我只为一个字符串编写了程序(输入一个字符串,它通过队列输出该字符串),并且运行良好。现在,我正在努力使它能够输入多个字符串,按Enter键,然后Reader将其添加到队列中,然后Writer将其显示出来。如果quit键入String ,则两个线程都必须停止并且程序应结束。
我的读者想法如下所示:
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);
}
}
该
同```
步块太大。通常,您想要同步的时间越短越好。进进出出。同步时间越长,其他线程被阻塞的时间就越长。
同步时执行用户输入是不行的。不应阻止其他线程,因为用户使用的是慢速打字机。
更糟糕的是,您已经在同步块内获得了整个程序的循环。不好的读者!如此贪婪。q在用户输入所有输入并键入“ quit”之前,它不会放弃锁定。只有这样,它才会释放锁,并允许编写器继续。
```js
while(!(in.equals("quit"))){
// System.out.println(q.isEmpty());
synchronized(q){
q.enqueue(in);
}
in = k.next();
if(in.equals("quit"))
System.exit(0);
}
作者有另一个致命的缺陷。一旦队列为空,它将退出。但是,队列很多时候都将是空的,不是吗?在这种情况下,作家不应该死。
一个快速的解决方法是将整个内容包装成无限循环:
public void run(){
while (true) {
synchronized(q){
while(!q.isEmpty()){
String out = q.dequeue();
System.out.println(out);
}
}
}
}
它可以使作家活着。但是,这也会消耗CPU时间,循环数百万次,而那个使用户感到不快的键盘缓慢地啄着它。如果检查系统监视器,则会看到程序峰值达到100%的CPU使用率。不是很好。
解决此问题有点超出本问答的范围。简短的答案是使用wait()和notify()使作者进入睡眠状态,直到有可用的东西为止。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。