2010-12-21 5 views
1

J'ai un problème étrange avec les minuteurs ... Mon minuteur fonctionne correctement lors des tests dans NetBeans, mais dès que je compile et exécute directement à partir du terminal (Ubuntu 10.4), la tâche qui est censée se produisent chaque minute exécute une fois et ne jamais exécute à nouveau ...Problème avec Java Timer

Voici mon code:

public static void main(String[] args) throws SQLException 
{ 
    // schedule db update task to occur every 15 mins 
    Timer timer = new Timer(); 
    timer.scheduleAtFixedRate(new TimerTask() 
     { 
      @Override public void run() 
      { 
       doUpdate(); 
      } 
     } , 0, updateInterval * 1000 * 60); 
     System.out.print("Starting auto update @ "); 

    // schedule cpu usage check to occur every 1 min 
    Timer cpu = new Timer(); 
    cpu.scheduleAtFixedRate(new TimerTask() 
     { 
      @Override public void run() 
      { 
       getCPU(); 
      } 
     } , 0, cpuUpdateInterval * 1000 * 60); 
} 

y at-il quelque chose que je fais mal?

+0

hmm avez-vous déboguer et vérifier les valeurs de cpuUpdateInterval? pourraient-ils avoir des valeurs différentes? Cela ressemble à une plate-forme (VM) dépendante ... – fasseg

+0

cpuUpdateInterval = 1. im en cours d'exécution dans netbeans dans Ubuntu (pas de problèmes), puis compiler et exécuter à partir du jar (exécute seulement le minuteur doUpdate()). Je l'ai même fait juste faire un println chaque fois qu'il entre dans la seconde minuterie. Il n'est jamais appelé après la première exécution. – JustinY17

+0

Je voudrais vérifier la version Java sur la ligne de commande et à partir de Netbeans - vous pouvez peut-être déboguer en changeant quelle JVM Netbeans utilise pour exécuter votre application. –

Répondre

1

Avec ce code,

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

/** @see http://stackoverflow.com/questions/4503829 */ 
public class TimerTest { 

    private static final int MAX = 8; 

    public static void main(String[] args) { 
     final Timer cpu = new Timer(); 
     cpu.scheduleAtFixedRate(new TimerTask() { 

      private int count; 

      @Override 
      public void run() { 
       count++; 
       System.out.println("Count: " + count); 
       if (count == MAX) { 
        cpu.cancel(); 
       } 
      } 
     }, 100, 1000); 
    } 
} 

J'ai obtenu les résultats escomptés:

 
$ make run 
java -version 
java version "1.6.0_20" 
OpenJDK Runtime Environment (IcedTea6 1.9.2) (6b20-1.9.2-0ubuntu1~10.04.1) 
OpenJDK Client VM (build 19.0-b09, mixed mode, sharing) 
java TimerTest 
Count: 1 
Count: 2 
Count: 3 
Count: 4 
Count: 5 
Count: 6 
Count: 7 
Count: 8 
2

Que fait getCPU()? S'il exécute le code JNA/JNI ou une bibliothèque externe, il est possible que vous manquiez la bibliothèque à partir de vos paramètres de ligne de commande.