Таймер

 
 
 
Сообщения:2
Написал такой вот таймер(ради одного эксперимента), но вот проблема: почему-то не срабатывает код в конструкции "if.."(или срабатывает, но как-то не так). Вроде код простой, но всё равно не понятно почему не срабатывает.

import java.util.Date;

public class Timer extends Thread{

    private int amountSecond = 0;

    private int count = 0;

    Timer(int amountSecond){

        this.amountSecond = amountSecond;
    }

    Timer(){

    }

    void setAmountSecond(int amountSecond){

        this.amountSecond = amountSecond;
    }

    int getCount(){
        return this.count;
    }

    public void counter(){

        Date date = new Date();

        long ms = date.getTime();

        boolean flag;

        if (this.amountSecond == 0){
            flag = false;
        } else {
            flag = true;
        }

        count = 0;

        while (true){

            date = new Date();

            if (date.getTime()-ms>=1000){

                count++;

                ms = new Date().getTime();

            }

            if (count == amountSecond && flag){
                break;
            }
        }
    }

    @Override
    public void run() {

        counter();
    }

    public static void main(String[] args) {

        Timer timer = new Timer();

        timer.start();

        int countB = 0;

        while (true){

            if (timer.getCount() > countB){

                countB = timer.getCount();
                
                System.out.println("blalala " + countB);
            }
        }

    }
}


Попробовал разобраться в отладчике Intellij IDEA и удивился, когда "timer.getCount() > countB" истинно происходит выполнение "countB = timer.getCount()", а выполнение "System.out.println("blalala " + countB)" не происходит, только при каких-то значениях возращенной переменной методом "timer.getCount()" происходит выполнение "System.out.println("blalala " + countB)". Короче иногда, а не всегда когда условие истинно "timer.getCount() > countB". Не обращайте внимания на карявый код, писал, ещё раз повторюсь, эксперимента/изучения.
 
 
Сообщения:1403
Немного упростим ваш код
public class Timer extends Thread {
    private int amountSecond = 0;// нигде не меняется, заменим ее применения в коде на 0
    private int count = 0;

    int getCount() {
        return this.count;
    }

  public void counter() {
        Date date = new Date();
        long ms = date.getTime();
        boolean flag;
        if (0 == 0) {  // всегда true, flag всегда false
            flag = false;
        } else {
            flag = true;
        }
        count = 0;
        while (true) {
            date = new Date();
            if (date.getTime() - ms >= 1000) {
                count++;
                ms = new Date().getTime();//ms нигде не используем
            }
            if (count == 0 && flag) { // всегда false
                break;
            }
        }
    }
}

после упрощения будет

  public void counter() {
        long ms = System.currentTimeMillis();
        count = 0;
        while (true) {
            if (System.currentTimeMillis() - ms >= 1000) {
                count++;
            }
        }
    }

Как мы видим данный код делает следующее.
Стартует и инкрементит переменную count, пока не пройдет 1 секунда.(кстати потом не завершается, а продолжает бесполезно пожирать процессор).

while (true) {
            if (timer.getCount() > countB) {
                countB = timer.getCount();
                System.out.println("blalala " + countB);
            }
        }

Тут мы просто печатаем count, если он увеличился, потом просто жрет процессорное время и ничего не делает. if у вас бесполезен и не понятно какой эксперимент вы хотели провести, посчитать количество инкрементов за 1 сек?
 
 
Сообщения:2
loptop:
Тут мы просто печатаем count, если он увеличился, потом просто жрет процессорное время и ничего не делает. if у вас бесполезен и не понятно какой эксперимент вы хотели провести, посчитать количество инкрементов за 1 сек?

Когда count = 1, в if будет условие true и должно сработать System.out.println("blalala " + countB) и в консоли должно появится "blalala 1". Так?
Изменен:11 ноя 2016 18:23
 
 
Сообщения:1403
А как он попадет в if? У вас же поток застрял в while
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет