我正在编写一些代码来检查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();
答案 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