使用java线程阻塞输出直到输入完成

使用java线程阻塞输出直到输入完成,java,multithreading,sockets,Java,Multithreading,Sockets,我正在使用套接字和线程制作一个简单的控制台聊天应用程序。我有两个不同的线程用于发送和读取消息。除了一件事,一切都很好。如果我当前在发送线程中,我必须阻止读线程 @Override public void run() { input = In.readLine(); while (!input.equals("x")) { if (input.isEmpty()) { Out.println("-----------------------

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

@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()”,同时我收到一些消息,那么只有在我完成输入后才会显示这些消息。

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

将所有传入消息添加到队列中,然后在输入完成后,处理入站消息队列并显示它们。我唯一允许使用的是以下内容:线程和(同步的)方法-等待、通知、通知、加入等。这样做有可能吗谢谢你!非常感谢你!!!你能推荐一些关于同步和多线程的好文章吗?再一次谢谢你,关于这个主题的书都写满了。需要理解的关键问题是:(1)原语(如Java中的
synchronized
)是如何工作的;(2)它们是必需的,你不能指望很少出现竞争条件。一篇好文章首先是这篇:。