如何使用线程来实现读写器程序?

问题描述 投票:1回答:1

我对阅读器/书写器实现有问题。我应该编写一个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创建线程,然后启动两个线程。

java loops java-threads reader writer
1个回答
1
投票
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);
}
© www.soinside.com 2019 - 2024. All rights reserved.