为什么布尔变量会阻止我的else语句打印?

时间:2015-09-07 22:30:27

标签: java while-loop boolean

所以我有一个定时器,每隔几秒就创建一个对象并将它们放入队列中。我正在运行一个while循环,如果队列为空或有人在其中,则打印出来。

while(1>0){

        if(wait_list.isEmpty()){

            System.out.println("Waiting");


        }else{

            System.out.println("Good");

        }
    }
}

工作正常,打印出“等待”直到某些东西被放入队列然后打印出“好”。第二个我尝试使它只打印一次,然后它将不会打印出else语句。它只打印“等待”一次,然后不执行任何其他操作,即使将对象添加到队列中也是如此。

 boolean wait = true;

 while(1>0){

        if(wait_list.isEmpty()){
            if(wait == true){
            System.out.println("Waiting");
            wait = false;
            }
        }else{

            System.out.println("Good");



        }
    }

我在这里错过了一些非常简单的事情。无限循环或其他东西(除了while循环)。

5 个答案:

答案 0 :(得分:1)

听起来你可能想要更像这样的东西:

while(wait_list.isEmpty()){
   System.out.println("Waiting");
}
System.out.println("Good");

您的while循环将继续,直到wait_list.isEmpty()返回false。然后在while循环结束后打印“Good”一次。

答案 1 :(得分:1)

在你的"好"阻止,您需要实际使用队列中的值,并且需要重置wait标志。

下面是一个完全可运行的示例。队列的内容并不重要,所以我只让它包含执行时间(计划和实际)。举个例子,我不想让它永远运行,所以永无止境的while循环被改为在10个值之后停止。为了表明在没有打印的情况下处理多个足够快的值,并且等待"等待",计时器将在33%的时间内添加2个值。

// Create queue, and task for adding values to queue
final ConcurrentLinkedQueue<Date[]> wait_list = new ConcurrentLinkedQueue<Date[]>();
TimerTask task = new TimerTask() {
    @Override public void run() {
        Date actualTime = new Date();
        Date scheduledTime = new Date(this.scheduledExecutionTime());
        wait_list.add(new Date[] { scheduledTime, actualTime });
        if (actualTime.getTime() % 3 == 0) // Add two elements about 33% of the time
            wait_list.add(new Date[] { scheduledTime, actualTime });
    }
};

// Run task every 0.1 second
Timer timer = new Timer();
timer.scheduleAtFixedRate(task, 100, 100);

// Process next 10 values, printing "Waiting" whenever queue goes empty
SimpleDateFormat fmt = new SimpleDateFormat("mm:ss.SSS");
boolean waiting = false;
int countDown = 10;
while (countDown > 0) {
    if (wait_list.isEmpty()) {
        if (! waiting) {
            System.out.println("Waiting");
            waiting = true;
        }
    } else {
        Date[] date = wait_list.remove();
        System.out.println("Good: scheduled=" + fmt.format(date[0]) + ", actual=" + fmt.format(date[1]));
        waiting = false;
        countDown--;
    }
}

// Stop timer
timer.cancel();

输出

Waiting
Good: scheduled=57:49.708, actual=57:49.718
Waiting
Good: scheduled=57:49.808, actual=57:49.811
Waiting
Good: scheduled=57:49.908, actual=57:49.920
Good: scheduled=57:49.908, actual=57:49.920
Waiting
Good: scheduled=57:50.008, actual=57:50.014
Waiting
Good: scheduled=57:50.108, actual=57:50.123
Waiting
Good: scheduled=57:50.208, actual=57:50.217
Good: scheduled=57:50.208, actual=57:50.217
Waiting
Good: scheduled=57:50.308, actual=57:50.310
Good: scheduled=57:50.308, actual=57:50.310

答案 2 :(得分:0)

您没有正确测试您的情况。看看你等待后会发生什么......

     if(wait_list.isEmpty()){ //still true. Goes in
        if(wait == true){ //false. Skips this
        System.out.println("Waiting");
        wait = false;
        }
      // nothing to do
    }else{

        System.out.println("Good");



    }

答案 3 :(得分:0)

您永远不会重置布尔标志的值,这就是它只打印一次的原因。

wait块中将else设置为false应重置布尔标记并允许while循环再次打印等待。

答案 4 :(得分:0)

添加if(wait == true)条件不会影响外if(wait_list.isEmpty())条件的执行。

您不能向队列添加任何内容。确保'计时器'确定将对象添加到wait_list。它需要是一个单独的线程才能实现。