开发者社区> 问答> 正文

如何使用线程来实现Reader / Writer程序?

我的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然后启动两个线程。

展开
收起
垚tutu 2019-12-12 09:47:48 852 0
1 条回答
写回答
取消 提交回答
  • #include
    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()使作者进入睡眠状态,直到有可用的东西为止。

    2019-12-12 09:48:12
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
多IO线程优化版 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载