2010-04-30 8 views
1

En essayant de faire un jeu simple où j'ai continuellement besoin de la contribution des joueurs. Cela doit se produire pendant une certaine période de temps seulement. Tout ce qui est envoyé après cela sera jeté. Après la période, un nouveau jeu commence. Alors:JAVA: Comment accepter les entrées pendant une certaine période de temps seulement

  1. jeu Démarrer
  2. Attendez que les commentaires de tous les joueurs pendant 10 secondes
  3. 10 secondes plus entrée

  4. Calculer le gagnant et faire des choses
  5. Aller 1.

Je pensais utiliser un timer et un timertask pour garder une trace de temps et peut-être utiliser une variable booléenne qui passe de "open" à "closed" après 10 secondes? S'il vous plaît donnez-moi quelques conseils à ce sujet.

Répondre

0

Vous avez raison, avec une minuterie, vous pouvez modifier cette valeur:

Timer timer = new Timer(); 
timer.schedule(new TimerTask(){ 
     public void run() { 
      synchronized(lock) { 
       isOpen = false; 
      } 
     } 
    }, 10000); 

Et voilà. La méthode à l'intérieur run sera exécuté 10 secondes après que vous appelez schedule

EDIT

Exemple:

import java.util.Timer; 
import java.util.TimerTask; 
import java.util.Date; 
import static java.lang.System.out; 

public class Test { 
    public static void main(String [] args) { 
     Timer timer = new Timer(); 
     timer.schedule(new TimerTask(){ 
      public void run() { 
       out.println(new Date()+" No more bets, thank you!"); 
      } 
     }, 10000); 
     out.println(new Date() + " Place your bets, place your bets!!"); 
    } 
} 
0

Oui, vous aurez besoin d'une minuterie, et une sorte d'un « ouvert/fermé "sera le chemin à parcourir. Assurez-vous de rendre votre drapeau "volatile" afin que tous les fils qui lisent votre entrée voient le changement à la fois. En y pensant, vous pourriez même penser à ce que la tâche de minuterie frappe chaque thread du lecteur avec une interruption, afin qu'ils soient tous informés en même temps, plutôt qu'à chaque fois qu'ils surgissent pour vérifier.

2

Plutôt que d'utiliser un Timer et TimerTask, je mettrais à jour votre réflexion à la façon plus actuelle d'utiliser Executors. Avec un ScheduledExecutor vous pouvez planifier un Runnable comme:

// class member or perhaps method var 
private boolean acceptInput = true; 

// elsewhere in code 
ScheduledExecutor executor = new ScheduledExecutor(1); 
startGame(); 
mainLoop(); 
executor.schedule(flipInput, 10, TimeUnit.SECONDS); 

// inner class 
private class FlipInput implements Runnable { 
    public void run() { 
     acceptInput = !acceptInput; 
     calculateWinner(); 
     doSomeStuff(); 
     startGame(); 
     executor.schedule(flipInput, 10, TimeUnit.SECONDS); 
     mainLoop(); 
    } 
} 
Questions connexes