为什么System.in没有正确响应同步尝试?

时间:2014-06-11 06:33:59

标签: java io synchronization

如果其中一个从System.in上的Scanner获取输入,我似乎无法强制调用System.out。

我确信这是一个简单的答案(我可以感觉到已经有了下来的选票),但它让我望而却步。

public class RegexApp{
static Scanner s = new Scanner(System.in);
static String read = "";
public static void main(String[] args) {
    while (true) {

           System.out.println("Please enter text."); 
           RegexApp.GetLine mg = new RegexApp().new GetLine();

           mg.start();
           mg.join();


    }
}
public class GetLine extends Thread{
    public void run()
    {

            read=s.nextLine();
            System.out.println(read);

    }
}
}

即使我尝试使用thread.join()强制应用程序完成System.out.println(读取);在while循环的下一次迭代和另一个System.out.println的打印输出之前(“请输入文本。”);我似乎无法按照正确的顺序让这两件事情发生。
我经常会得到另一个System.out.println(“请输入文本。”);,紧接着是System.out.println(read)的结果;从最后一行输入(与预期的相反顺序。)

似乎只允许从System.in等待来自System.in的输入的System.out调用返回,同时应用程序继续使用其他System.out调用。我想确保应用程序在循环到下一个之前实际等待一个System.out调用的结果。

(我尝试过synchronized(System.out),(this)和(System.in),有wait()和notify(),都无济于事。)


我得到了

Please enter text.
(I type HELLO and hit enter)
Please enter text.
HELLO
(I type GOODBYE and hit enter)
Please enter text.
GOODBYE

我预期的地方

Please enter text.
(I type HELLO and hit enter)
HELLO
Please enter text.
(I type GOODBYE and hit enter)
GOODBYE
Please enter text.

基本上,订单是倒置的,我无法弄清楚原因。


我在网站上看到了一个相关的问题,其中提到了刷新流的顺序,并且给出了涉及synchronized(System.out){}的修复,但这并没有解决这个问题。

0 个答案:

没有答案