2012-07-29 2 views
11

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

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); 

    } 
}; 
+1

http://www.ibm.com/developerworks/java/library/j-schedule/index.html – nullpotent

+0

Вы уверены, что создаете поток 'temperatureUp' и вызываете' start() 'на нем? Этот код отлично подходит для меня. –

+0

Зачем вам использовать поток и таймер? Таймер работает на собственной ветке –

ответ

1

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

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

Вы можете передать определение класса Timer здесь, чтобы оказать дополнительную помощь

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

+0

с линией 'increaserTimer.schedule (увеличениеТемпература, 2000, 2000);' все еще ничего не происходит! – Afflatus

+0

@ Elham - Раньше я этого не замечал, но вы порождаете новый поток из другого потока? Это очень неправильный подход. Подумайте о том, как изменить структуру, чтобы потоки порождались и планировались с глобального уровня. Вот ссылка на примерный проект, который поможет вам изменить структуру: http://www.roseindia.net/java/example/java/util/CertainAndRepeatTime.shtml – afrin216

+0

Другими словами, я не могу использовать Timer для планирования серии действий, которые выполняются потоком. правильно? – Afflatus

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(); 
    } 
} 
15

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

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

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

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

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
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++; 
    } 

}