IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Initialiser une durée


Sujet :

avec Java

  1. #1
    Membre régulier Avatar de Palsajicoco
    Étudiant
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Points : 84
    Points
    84
    Par défaut Initialiser une durée
    Salut,

    J'aimerai bien savoir si je pourrai initialiser une durée (temps) en java, genre une variable qui contient 2 minutes.
    Merci.

  2. #2
    Membre actif
    Homme Profil pro
    Première S
    Inscrit en
    Juillet 2010
    Messages
    266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Première S

    Informations forums :
    Inscription : Juillet 2010
    Messages : 266
    Points : 281
    Points
    281
    Par défaut
    Souvent, on marche avec des int, tout simplement ...
    Tu veux initialisé deux minutes, tu initialise int duree = 120
    Après, il existe peut-être des classes spécialisée, mais pour des utilisation simple comme ça, les objets int suffisent ...

  3. #3
    Membre régulier Avatar de Palsajicoco
    Étudiant
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Points : 84
    Points
    84
    Par défaut
    Merci pour la réponse,

    Je veux faire un 'while' sur 2 minutes par exemple, je sais pas comment décrémenter le temps pour sortir de la boucle

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    while d'accord, mais par pas de combien, pour en faire quoi, quel est le but?

  5. #5
    Membre régulier Avatar de Palsajicoco
    Étudiant
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Points : 84
    Points
    84
    Par défaut
    Ok,

    Je fait un ReminTask qui repete un processus pour un laps de temps donné. et dans le run du ReminTask, je devrai faire ce while pour faire des instructions et sortir si le laps de tmp est depassé!
    voice le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    public class SemaphoreTest {
     
    	// static Date now = new Date();
            static int lapsDeTemp = 5 * 1000;
    	// private static final Log log = LogFactory.getLog(SemaphoreTest.class);
     
    	public static int numEquipment = 50;
     
    	static List<Integer> workers = new LinkedList<Integer>();
    	static List<Integer> processedWorkers = new LinkedList<Integer>();
    	static List<Integer> workersToDo = new LinkedList<Integer>();
     
    	public static void initWorkers() {
    		for (int w = 0; w < numEquipment; w++) {
    			workers.add(w);
    		}
     
    		workersToDo.addAll(workers);
    	}
     
    	static class RemindTask extends TimerTask {
    		int j = 0;
     
    		public RemindTask() {
    			super();
    			initWorkers();
    		}
     
    		// init endDate (schedule)
    		public static Date endDate;
    		public static Date startDate;
     
    		DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
    		{
    			try {
    				startDate = dateFormat.parse("05/26/2011 13:13:12");
    				endDate = dateFormat.parse("05/29/2011 12:55:12");
    			} catch (ParseException e) {
    				e.printStackTrace();
    			}
    		}
     
    		@Override
    		public void run() {
     
    			if (endDate.after(new Date())) {
     
    				log("Iteration " + j);
    				log("Workers to process during this iteration: " + workersToDo);
     
    				processedWorkers.clear();
     
    				List<Integer> workersToDoCopy = new LinkedList<Integer>(
    						workersToDo);
    				Iterator<Integer> workerIterator = workersToDoCopy.iterator();
     
    				While(lapsDeTemp "n'est pas fini"){
     
    					Integer currentWorker = workerIterator.next();
    					Processor processor = new Processor("THREAD-"
    							+ currentWorker);
    					new Thread(processor).start();
    					workersToDo.remove(currentWorker);
    					processedWorkers.add(currentWorker);
    				}
    				j++;
    			} else {
    				System.exit(0);
    			}
    			log("Workers Done: " + processedWorkers.size() + " -> "
    					+ processedWorkers);
    			log("Workers Left: " + workersToDo.size() + " -> " + workersToDo);
    			workersToDo.addAll(processedWorkers);
    			/*
    			 * for (Integer w : workers) { log.debug(w + " processed " +
    			 * w.getProcessCount()); }
    			 */
     
    		}
    	}
     
    	public static void log(Object o) {
    		System.out.println(o.toString());
    	}
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
     
    		Timer timer;
    		timer = new Timer();
    		timer.schedule(new RemindTask(), 0, lapsDeTemp);
     
    	}
     
    }
    le while lapsDeTemp n'est pas fini est ma condition, et lapsDeTemp c'est le paramètre de bouclage du RemindTask.

    Merci ^^

  6. #6
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    dans ton code, remplace le System.exit(0) par un appel à cancel() et la tâche se terminera sans arrêter la JVM (je suppose que c'est ça que tu demande).

    Si tu veux fixer la date de fin à "maintenant + 15 minutes", c'est

    endDate = new Date(System.currentTimeMillis()+15*60*1000);

  7. #7
    Membre régulier Avatar de Palsajicoco
    Étudiant
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Points : 84
    Points
    84
    Par défaut
    Oui je comprend ces commandes merci, mon problèmes c'est que comment je pourrai tourner mon while pour une durée bien définie, genre 5 secondes, 5*1000!

  8. #8
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    en fait votre boucle n'est pas très logique. Quel est le but recherché derriere? Parce que là, ce que vous faite c'est, pas exemple, toutes les 5 minutes démarrer X thread "processor". Mais ce démarrage ca prend à peine quelque secondes :/ Si ce que vous voulez c'est "faire le maximum possible de processor jusque leur fin dans le temps imparti", c'est plutot ce genre de boucle qu'il faudrait faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    long fin = System.currentTimeMillis()+lapsDeTemps;
    while (System.currentTimeMillis() < fin){
    	Integer currentWorker = workerIterator.next();
    	Processor processor = new Processor("THREAD-"
    		+ currentWorker);
    	processor.run(); // tourner dans le thread courant
    	workersToDo.remove(currentWorker);
    	processedWorkers.add(currentWorker);
    }

  9. #9
    Membre régulier Avatar de Palsajicoco
    Étudiant
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Points : 84
    Points
    84
    Par défaut
    Merci pour votre réponse,

    A priori ça ne marche pas, je pense qu'il y a un busy waiting ou quelque chose de ce genre, et que le problème est plus complexe que ça.

    Mon problème c'est faire un processus thread pour des items dans une liste todo (workersToDo), mais puisque dans un laps de temps, défini dans le RemindTask, je pourrai ne pas traiter tous les items, alors j'ai fait d'autres listes qui enregistrent les items qui sont pas traitées, et commencer avec ceux la prochaine boucle du RemindTask.
    Et la je galère avec les conditions avez vous une proposition de solution plus efficace a ça? Merci beaucoup.

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    oui: laissez tomber le timer et tout ce bordel, passez pas un ThreadPoolExecutor, dont le boulot est justement de traiter au fur et a mesure des tâches en les répartissant dans un ou plusieurs threads

  11. #11
    Membre régulier Avatar de Palsajicoco
    Étudiant
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Points : 84
    Points
    84
    Par défaut
    Merci pour la proposition,

    Je pense que c'est pas du tout mon outil recherché puisque je gère déjà mes thread proprement avec sémaphore, j’exécute que 3 threads en même temps, mon RemindTask aussi marche parfaitement, Mon problème réside dans la condition que je devrai ajouter .. si quelques indices ne sont pas traitées dans ma boucle RemindTask, ils devront être les premiers a être traitées dans la prochaine loop.
    Sinon, vous proposez un design d’implémentation avec votre outil, parce que je vois que ça gère plutôt les threads pas le temps a partir des exemples sur internet.

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    j'ai pas d'autre réponses que celles données. Soit vous appelez run, et visiblement vous bloquez, soit vous appelez start, mais alors le test ne sert à rien car en quelque millisecondes tous les éléments de votre queue auront un Thread prêt à travailler

  13. #13
    Membre régulier Avatar de Palsajicoco
    Étudiant
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Points : 84
    Points
    84
    Par défaut
    Merci pour vos réponses,

    Le problème c'est que j'ai affaire avec des équipements de transmission de données (jusqu’à 5000 équipements ou même plus) et je ne suis pas sur qu'a chaque fois le thread va marcher, ou la durée de chaque thread, c'est pour ca je fait des listes pour éviter de skipper des équipements, donc dans une boucle je devrai faire le maximum de threads, le reste je le save dans la liste pour commencer avec la prochaine loop. En final, ma loop s’exécute pendant une durée pour faire le maximum de threads, c'est pour ça que je cherche a avoir une loop sur la durée mais je crains que ça ne soit pas efficace

  14. #14
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    voilà ce que vous essayez de faire avec votre code. Soit une lsite de 2000 machiens à controler sur la période de 15 secondes.


    1) vous entrez la liste (temps: 0ms)
    2) vous commencez le timerTask (temps 1ms)
    3) vous bouclez sur votre lsite et pour chaque élément vous démarrez un thread (temps 1000ms on va dire pour démarrer 2000 threads)
    4) le timertask a déjà fini et marque que tout est fait

    Pendant ce temps, 2000 threads se battent pour les ressources et vous n'avez aucune idée de combien de temps mettra chacun.

    Si votre but est, toutes les N secondes, de controler X équipements si possible, il faut revoir toute la logique de code. vosu devrez avoir un nombre limité (une dizaine par exemple) de thread qui traitent chacun X/10 équipement, en respectant des délais. Ensuite, dans votre boucle principale, vous faite un waitFor() sur chacun de ces threads. Enfin, une fois que chaque thread à fini, vous faites la mise à jour de ce qui est fait et reste à faire.

    Maintenant, l'idéal, ce serait plutot une lecture continue par un ensemble de thread des équipement. Si vous avez, disont, 20 thread qui controlent en continu une liste de 5000 équipements, il faudrait 20 équipement dingos qui ne répondent pas (et que votre thread soit incapable de gérer) pour qu'on ne puisse plus controler le reste.

    PS: 5000 threads, l'application va se vautrer. Compter 1M de mémoire / thread en java. Il vous faudrait 5G juste pour les threads

  15. #15
    Membre régulier Avatar de Palsajicoco
    Étudiant
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Points : 84
    Points
    84
    Par défaut
    Merci,

    Je fait déjà un traitement sémaphore sur les thread pour exécuter un nombre défini d'équipements simultanément, mais mon problème comme je vous ai dit, je veux boucler sur le maximum d’équipements sans avoir besoin d'un waitFor(), c'est pour économiser les ressources et le temps, puisque le sémaphore gère les threads, dés qu'un thread termine un autre entre a sa place.

  16. #16
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    le problème c'est que dans votre code, vous n'avez rien à tester, puisque vous lancez des threads. Soit vous les attendez tous via waitFor (bon courage), soit vous ne lancez pas de thread.

  17. #17
    Membre régulier Avatar de Palsajicoco
    Étudiant
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Points : 84
    Points
    84
    Par défaut
    J'ai une solution peut être et vous pouvez m'aidez si vous voulez

    Dans mon runnable j'appelle la méthode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    public void doSomething() {
    		// Check if permit is available
    		if (this.acquireAccess()) {
    			printMessage("Complex processing started for " + this.name + ".");
    		}
     
    		try {
    			Thread.sleep(rand.nextInt(5000));
     
    			// gatherXXXData
    		} catch (InterruptedException e) {
    			e.printStackTrace();
    		}
     
    		this.releaseAccess();
    		printMessage("Processing completed by " + this.name + ".");
    	}
    puis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public class Processor implements Runnable {
     
    	private String threadName = null;
     
    	public Processor(String name) {
    		this.threadName = name;
    	}
     
    	public void run() {
    		ComplexProcess busProcess = new ComplexProcess(this.threadName);
    		busProcess.doSomething();
    	}
     
    }
    Je les fait dans des classes séparées pour plus de lisibilité =)
    Savez vous comment je pourrai enregistrer l'id du thread executé la ou je fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		printMessage("Processing completed by " + this.name + ".");
    parceque la mon code m'affiche:

    Iteration 0
    Workers to process during this iteration: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
    Workers Done: 20 -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
    Workers Left: 0 -> []
    12:27:37 Complex processing started for THREAD-2.
    12:27:37 Complex processing started for THREAD-10.
    12:27:37 Complex processing started for THREAD-6.
    12:27:37 Processing completed by THREAD-10.
    12:27:37 Complex processing started for THREAD-0.
    12:27:41 Processing completed by THREAD-0.
    12:27:41 Complex processing started for THREAD-14.
    12:27:41 Complex processing started for THREAD-1.
    12:27:41 Processing completed by THREAD-6.
    12:27:41 Processing completed by THREAD-2.
    12:27:41 Complex processing started for THREAD-18.
    Iteration 1
    Workers to process during this iteration: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
    Workers Done: 20 -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
    Workers Left: 0 -> []
    12:27:44 Complex processing started for THREAD-3.
    12:27:44 Processing completed by THREAD-14.
    12:27:44 Processing completed by THREAD-1.
    12:27:44 Complex processing started for THREAD-4.
    12:27:45 Processing completed by THREAD-3.
    12:27:45 Complex processing started for THREAD-5.
    12:27:45 Processing completed by THREAD-18.
    12:27:45 Complex processing started for THREAD-7.
    12:27:46 Complex processing started for THREAD-8.
    12:27:46 Processing completed by THREAD-4.
    12:27:46 Processing completed by THREAD-5.
    12:27:46 Complex processing started for THREAD-9.
    12:27:46 Complex processing started for THREAD-15.
    12:27:46 Processing completed by THREAD-7.
    donc ça serai bien d'enregistrer plutôt les thread exécuté. Help xD

    ps: l’exécution du sémaphore ne laisse passer que 3 threads en même temps.

  18. #18
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    l'enregistrer dans quoi?

  19. #19
    Membre régulier Avatar de Palsajicoco
    Étudiant
    Inscrit en
    Février 2007
    Messages
    229
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 229
    Points : 84
    Points
    84
    Par défaut
    C'est bon, j'ai resolu mon probleme
    en fait, quand je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printMessage("Processing completed by " + this.name + ".");
    je fait une liste dans laquelle j'enregistre les éléments procédés. et du coup voila en lançant tout les threads d'un coup, je saurai lesquels qui ont été procédés =)

    Merci pour le support

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VB6]Initialiser une variable Static dans un évenement
    Par loverdose dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 20/01/2005, 15h57
  2. [CR] recuperer une durée grace a 2 date
    Par cmgirondins dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 13/01/2005, 08h20
  3. Réponses: 9
    Dernier message: 29/06/2004, 09h40
  4. Formater une durée sous la forme Heure:Minute:Seconde
    Par marsupile dans le forum C++Builder
    Réponses: 2
    Dernier message: 01/02/2004, 00h29
  5. Réponses: 3
    Dernier message: 17/12/2003, 12h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo