2010-02-06 4 views

Répondre

0

Je ne suis pas entièrement sûr de comprendre le problème. Si vous souhaitez générer un nombre aléatoire différent toutes les deux minutes, appelez simplement votre fonction rnd toutes les deux minutes.

Cela pourrait être aussi simple que quelque chose comme (pseudo-code):

n = rnd() 
repeat until finished: 
    use n for something 
    sleep for two minutes 
    n = rnd() 

Si vous souhaitez continuer à utiliser le même nombre aléatoire pendant deux minutes et générer une nouvelle:

time t = 0 
int n = 0 

def sort_of_rnd(): 
    if now() - t > two minutes: 
     n = rnd() 
     t = now() 
    return n 

qui continuera à renvoyer le même nombre pour une période de deux minutes.

+0

@Arvind s'il vous plaît modifier le code dans votre question – Yacoby

+0

@Aravindkumar: S'il vous plaît modifier votre propre question et mettre le code là. –

+0

ok peter merci – Aravindkumar

1

Vous avez deux exigences qui ne sont pas liés:

  1. Générer des nombres aléatoires
  2. Effectuez la tâche toutes les 2 minutes.

Pour faire quoi que ce soit toutes les 2 minutes, vous pouvez utiliser un ScheduledExecutorService.

+0

Meilleure réponse jusqu'à présent +1 – whiskeysierra

1

Vous pouvez planifier l'exécution de votre programme toutes les deux minutes en utilisant les fonctions de planification disponibles dans votre environnement cible (par exemple, cron, at, Tâches planifiées Windows, etc.).

Ou vous pouvez utiliser la méthode Thread#sleep de suspendre votre application pour 2,000ms et exécuter votre code dans une boucle:

while (loopCondition) { 
    /* ...generate random number... */ 

    // Suspend execution for 2 minutes 
    Thread.currentThread().sleep(1000 * 60 * 2); 
} 

(C'est code juste exemple, vous devrez gérer le InterruptedException et tel.

+0

C'est très occupé et très inefficace. – whiskeysierra

+2

@Willi: Non, ce n'est pas le cas. C'est tout le * point * d'utiliser 'sleep'. Et notez que ce n'est pas ma première suggestion. –

+0

Je n'ai jamais dit ça. Et le blocage du thread actuel n'est même pas une solution au problème. Il veut qu'un nombre aléatoire soit généré toutes les 2 secondes. Quel sera le point de bloquer et d'attendre deux secondes sans rien faire? L'utilisation d'un ScheduledExecutorService serait la meilleure solution ici. Thread.sleep (..) n'a presque jamais de sens. – whiskeysierra

6

Cet exemple ajoute un nombre aléatoire à une file d'attente de blocage toutes les deux minutes. Vous pouvez prendre les numéros de la file d'attente quand vous en avez besoin. Vous pouvez utiliser java.util.Timer comme une installation légère pour planifier la génération de numéros ou vous pouvez utiliser java.util.concurrent.ScheduledExecutorService pour une solution plus polyvalente si vous avez besoin de plus de sophistication à l'avenir. En écrivant les numéros dans une file d'attente, vous disposez d'une interface unifiée de récupération des numéros des deux installations.

Tout d'abord, nous avons mis en place la file d'attente de blocage:

final BlockingDequeue<Integer> queue = new LinkedBlockingDequeue<Integer>(); 

Voici la configuration avec java.utilTimer:

TimerTask task = new TimerTask() { 
    public void run() { 
     queue.put(Math.round(Math.random() * 99)); 
     // or use whatever method you chose to generate the number... 
    } 
}; 
Timer timer = new Timer(true)Timer(); 
timer.schedule(task, 0, 120000); 

Ceci est la configuration avec java.util.concurrent.ScheduledExecutorService

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); 
Runnable task = new Runnable() { 
    public void run() { 
     queue.put(Math.round(Math.random() * 99)); 
     // or use whatever method you chose to generate the number... 
    } 
}; 
scheduler.scheduleAtFixedRate(task, 0, 120, SECONDS); 

Maintenant, vous pouvez obtenir un nouveau nombre aléatoire dans la file toutes les deux minutes. La file d'attente bloquera jusqu'à ce qu'un nouveau numéro devienne disponible ...

int numbers = 100; 
for (int i = 0; i < numbers; i++) { 
    Inetger rand = queue.remove(); 
    System.out.println("new random number: " + rand); 
} 

Une fois que vous avez terminé, vous pouvez mettre fin au planificateur. Si vous avez utilisé la minuterie, il suffit de faire

timer.cancel(); 

Si vous avez utilisé ScheduledExecutorService vous pouvez faire

scheduler.shutdown(); 
+1

La classe Timer est considérée obsolète, vous devez utiliser un ScheduledExecutorService à la place. – whiskeysierra

+0

Bon point. Changé l'exemple pour utiliser ScheduledExecutorService – VoidPointer

+3

@Willi Schönborn, s'il vous plaît ne pas faire les choses! http://stackoverflow.com/questions/2213109/java-util-timer-is-is-deprecated –

1
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 

import javax.swing.JFrame; 
import javax.swing.Timer; 

public class TimerExample { 
    Random rand = new Random(); 
    static int currRand; 

    TimerExample() { 
     currRand = rand.nextInt(99); 
     ActionListener actionListener = new ActionListener() { 
      public void actionPerformed(ActionEvent actionEvent) { 
       currRand = rand.nextInt(99); 
      } 
     }; 
     Timer timer = new Timer(2000, actionListener); 
     timer.start(); 
    } 

    public static void main(String args[]) throws InterruptedException { 
     TimerExample te = new TimerExample(); 
     while(true) { 
      Thread.currentThread().sleep(500); 
      System.out.println("current value:" + currRand); 
     } 
    } 
} 

EDIT: Bien sûr, vous devez définir 2000 dans la nouvelle minuterie (2000, actionListener); à 120 000 pendant deux minutes.

+0

L'introduction d'une dépendance sur Swing semble un peu exagérée pour ce genre de problème. – VoidPointer

+0

Bien sûr, java.util.TimerTask et Timer pourraient également être utilisés. Je viens d'étendre un exemple existant ... – stacker

+0

+1 pour instancier 'Random' et utiliser' nextInt (int n) '. – trashgod

Questions connexes