2016-05-14 67 views
1

我正在使用套接字和线程进行简单的控制台聊天应用程序。我有两个不同的线程来发送和阅读邮件。除了一件事以外,一切正常。如果我目前在发送线程中,我必须阻止读者线程。阻塞输出,直到输入完成使用线程java

@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) { 

    } 
} 

我要做的是以下几点:如果我目前正在写的消息“消息= In.readLine()”,并在此期间我收到一些消息,这些应该只在完成输入后才显示。

+0

将所有传入消息添加到队列中,然后当输入完成时,处理入站消息队列并显示它们。 – KevinO

+0

我唯一允许使用的是:线程和(同步)方法 - 等待,通知,notifyAll,加入等。有这种可能性吗? - 谢谢 –

回答

2

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

+0

完美地工作!非常感谢!!!你能推荐任何关于同步和多线程的好文章吗?再次感谢 –

+0

有关于此主题的完整书籍。需要了解的关键是(1)基元如何像Java中的“synchronized”一样工作,以及(2)它们是否是必需的,并且不希望出现竞争条件将不经常出现的情况。一篇很好的文章就是这一篇:http://www.javaworld.com/article/2074979/java-concurrency/double-checked-locking-clever--but-broken.html。 –