Подтвердить что ты не робот

Таймер в Java Thread

У меня есть поток, который отвечает за выполнение некоторых процессов. Я хочу сделать так, чтобы эта обработка выполнялась каждые 3 секунды. Я использовал код ниже, но когда начинается поток, ничего не происходит. Я предположил, что, когда я определяю задачу для своего таймера, он автоматически выполняет ScheduledTask в течение интервала времени, но он ничего не делает. Что мне не хватает?

class temperatureUp extends Thread 
{
    @Override
    public void run()
    {
    TimerTask increaseTemperature = new TimerTask(){

        public void run() {
        try {
            //do the processing 
        } catch (InterruptedException ex) {}
        }
    };

    Timer increaserTimer = new Timer("MyTimer");
    increaserTimer.schedule(increaseTemperature, 3000);

    }
};
4b9b3361

Ответ 1

Несколько ошибок в фрагменте кода:

  • Вы расширяете класс Thread, который не является действительно хорошей практикой.
  • У вас есть Timer внутри Thread? Это не имеет смысла, поскольку a Timer работает сам по себе Thread.

Вы должны (когда/где необходимо) реализовать Runnable здесь здесь для краткого примера, однако я не вижу необходимости как для Thread и Timer в предоставленном фрагменте.

См. приведенный ниже пример рабочего Timer, который будет просто увеличивать счетчик на каждый раз при его вызове (каждые 3 секунды):

import java.util.Timer;
import java.util.TimerTask;

public class Test {

    static int counter = 0;

    public static void main(String[] args) {

        TimerTask timerTask = new TimerTask() {

            @Override
            public void run() {
                System.out.println("TimerTask executing counter is: " + counter);
                counter++;//increments the counter
            }
        };

        Timer timer = new Timer("MyTimer");//create a new Timer

        timer.scheduleAtFixedRate(timerTask, 30, 3000);//this line starts the timer at the same time its executed
    }
}

Добавление:

Я сделал короткий пример включения Thread в микс. Итак, теперь TimerTask будет просто увеличивать counter на 1 каждые 3 секунды, а Thread будет отображать значение counter в течение 1 секунды каждый раз, когда он проверяет счетчик (он завершит сам и таймер после counter==3):

import java.util.Timer;
import java.util.TimerTask;

public class Test {

    static int counter = 0;
    static Timer timer;

    public static void main(String[] args) {

        //create timer task to increment counter
        TimerTask timerTask = new TimerTask() {

            @Override
            public void run() {
                // System.out.println("TimerTask executing counter is: " + counter);
                counter++;
            }
        };

        //create thread to print counter value
        Thread t = new Thread(new Runnable() {

            @Override
            public void run() {
                while (true) {
                    try {
                        System.out.println("Thread reading counter is: " + counter);
                        if (counter == 3) {
                            System.out.println("Counter has reached 3 now will terminate");
                            timer.cancel();//end the timer
                            break;//end this loop
                        }
                        Thread.sleep(1000);
                    } catch (InterruptedException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        });

        timer = new Timer("MyTimer");//create a new timer
        timer.scheduleAtFixedRate(timerTask, 30, 3000);//start timer in 30ms to increment  counter

        t.start();//start thread to display counter
    }
}

Ответ 2

Чтобы делать что-то каждые три секунды, вы должны использовать scheduleAtFixedRate (см. javadoc).

Однако ваш код действительно ничего не делает, потому что вы создаете поток, в котором вы запускаете таймер непосредственно перед остановкой потока (больше нечего делать). Когда таймер (который является одним выстрелом один) срабатывает, нет прерывания потока (запуск завершен до).

class temperatureUp extends Thread 
{
    @Override
    public void run()
    {
    TimerTask increaseTemperature = new TimerTask(){

        public void run() {
        try {
            //do the processing 
        } catch (InterruptedException ex) {}
        }
    };

    Timer increaserTimer = new Timer("MyTimer");
    //start a 3 seconds timer 10ms later
    increaserTimer.scheduleAtFixedRate(increaseTemperature, 3000, 10);

    while(true) {
         //give it some time to see timer triggering
         doSomethingMeaningful();
    }
}

Ответ 3

import java.util.Timer;
import java.util.TimerTask;

public class ThreadTimer extends TimerTask{
    static int counter = 0;

    public static void main(String [] args) {
        Timer timer = new Timer("MyTimer");
        timer.scheduleAtFixedRate(new ThreadTimer(), 30, 3000);
    }

    @Override
    public void run() {
        // TODO Auto-generated method stub
        System.out.println("TimerTask executing counter is: " + counter);
        counter++;
   }

}

Ответ 4

Я думаю, что метод, который вы использовали, имеет подпись schedule(TimerTask task, long delay). Таким образом, вы просто задерживаете время начала ТОЛЬКО выполнения.

Чтобы запланировать его выполнение каждые 3 секунды, вам нужно пойти с этим методом schedule(TimerTask task, long delay, long period), где параметр третий используется для предоставления интервала периода.

Здесь вы можете сослаться на определение класса таймера, чтобы получить дополнительную помощь

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Timer.html