在while循环中带/不带System.out.println()的奇怪输出

时间:2014-11-16 22:28:18

标签: java multithreading

我正在编写一些代码来检查while循环中另一个对象的条件,然后在遇到时执行该条件。在这种情况下,我正在等待将字符串设置为null以外的其他内容。

这看起来很简单,但我有一些奇怪的输出。如果我放一个System.out.println();循环中的语句(即打印到控制台的数千条相同的行),代码在其应该继续,并继续打印并打印必要的对象时退出。

然而,只要我拿这个System.out.println(); while循环中的语句(并且不做任何改变!)之后没有任何内容被打印出来。关于为什么会这样的任何想法?我试图刷新它,我已经尝试手动为每个语句添加新行。我甚至尝试在while循环中简单地递增一个变量(但不打印它)(这不起作用)。我有点不知所措。代码如下(在自己的主题中)

public void run(){
    System.out.println("Hey kids" + "\n\n");
    //int test = 0; //tried this to make it work.
    while(gui.directoryName == null){
         //this is the problematic loop
         //test++; 
         //System.out.println("Uncomment this to make it work");
    }
    System.out.println("here" + "\n\n");
    parseFiles();
    //launchFactory();
}

private void parseFiles() {
    System.out.println("here");
    String[] files = new File(gui.directoryName).list();
    String[] factoryFiles = new File(gui.directoryName).list(new FACTORYFileFilter());
    String[] recipeFiles = new File(gui.directoryName).list(new RCPFileFilter());
    for(String file: files){
        System.out.println("File: " + file + "\n\n");
    }
    for(String file : factoryFiles){
        System.out.println("Factory file = " + file + "\n\n");

    }
    for(String file : recipeFiles){
        System.out.println("Recipe file: " + file + "\n\n");
    }

    System.out.println("here");
    System.out.flush();

2 个答案:

答案 0 :(得分:1)

好吧,我假设你是多线程的,并希望另一个线程初始化 gui.directoryName 。在那种情况下(有人纠正我,如果我错了)问题仍然是你有一个无限循环。你的循环应该做的事情除了经常检查它的停止条件,或者它不会让其他线程任何进程时间。您的问题可能会通过添加

来解决
`try {
    Thread.sleep(10);
} catch (InterruptedException e) {
    e.printStackTrace();
    Thread.currentThread().interrupt();
}`

进入while,这将让剩下的程序时间呼吸。

答案 1 :(得分:0)

问题在于你正在使用该循环将线程的执行推向最大,这会占用周期并且不会让你的GUI线程做很多工作。

使用条件变量可以最完美地解决您想要实现的目标。您应该创建一个将由两个线程共享的条件变量;像这样的东西:

Lock lock = new ReentrantLock();
Condition cond = lock.newCondition();

正在等待gui.directoryName的线程应调用cond.await(),它将阻塞直到发出条件信号。 GUI线程一旦将值设置为gui.directoryName就应该调用cond.signalAll(),这将通知被阻塞的线程它现在可以继续执行。这将彻底摆脱你的while循环,以及你原来的问题。

有关条件的Oracle文档:https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Condition.html