【问题标题】:Blocking the output until input is finished using threads java使用线程java阻塞输出直到输入完成
【发布时间】:2016-05-18 02:28:05
【问题描述】:

我正在使用套接字和线程制作一个简单的控制台聊天应用程序。我有两个不同的线程用于发送和阅读消息。除了一件事,一切都很好。如果我当前在发送线程中,我必须阻止阅读器线程。

@Override
public void run() {
    input = In.readLine();

    while (!input.equals("x")) {
        if (input.isEmpty()) {
            Out.println("----------------------------");
            Out.print("Your message: ");
            message = In.readLine();
            Out.println("----------------------------");

            writer.println(message);
            writer.flush();
        }

        input = In.readLine();
    }
}

这里是阅读帖

@Override
public void run() {
    try {
        while ((receivedMessage = reader.readLine()) != null) {
            Out.println("Received message: " + receivedMessage);
        }
    } catch (IOException ex) {

    }
}

我要做的是:如果我当前正在写一条消息“message = In.readLine()”,同时我收到一些消息,这些应该只有在我完成输入后才会显示。

【问题讨论】:

  • 将所有传入的消息添加到一个队列中,然后当输入完成后,处理入站消息队列并显示出来。
  • 我唯一被允许使用的是:线程和(同步的)方法——等待、通知、notifyAll、join 等。这样的事情有可能吗? - 谢谢

标签: java multithreading sockets


【解决方案1】:

有多种方法可以做到这一点。也许最简单的方法是在键入要发送的消息时使用监视器锁定接收消息的显示。基本上有一个Object - 你可以称它为 displayLock 或类似的东西 - 并在发送线程中的if 块的前四行和接收中的Out.println 行中同步此Object 块的前四行线。这样,一次只能进行两个同步块中的一个。

【讨论】:

  • 完美运行!太感谢了!!!你能推荐一些关于同步和多线程的好文章吗?再次感谢
  • 关于这个主题的书籍有很多。要理解的关键事项是 (1) 原语(如 Java 中的 synchronized)如何工作,以及 (2) 它们是必需的,并且您不能希望竞争条件不常见。一篇不错的文章可以从这一篇开始:javaworld.com/article/2074979/java-concurrency/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 2012-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
相关资源
最近更新 更多