Salut,
J'aimerai bien savoir si je pourrai initialiser une durée (temps) en java, genre une variable qui contient 2 minutes.
Merci.
Salut,
J'aimerai bien savoir si je pourrai initialiser une durée (temps) en java, genre une variable qui contient 2 minutes.
Merci.
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 ...
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
while d'accord, mais par pas de combien, pour en faire quoi, quel est le but?
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:
le while lapsDeTemp n'est pas fini est ma condition, et lapsDeTemp c'est le paramètre de bouclage du RemindTask.
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); } }
Merci ^^
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);
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!
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); }
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.
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
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.
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
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
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
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.
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.
J'ai une solution peut être et vous pouvez m'aidez si vous voulez
Dans mon runnable j'appelle la méthode :
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
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 + "."); }
Je les fait dans des classes séparées pour plus de lisibilité =)
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(); } }
Savez vous comment je pourrai enregistrer l'id du thread executé la ou je fait:
parceque la mon code m'affiche:
Code : Sélectionner tout - Visualiser dans une fenêtre à part printMessage("Processing completed by " + this.name + ".");
donc ça serai bien d'enregistrer plutôt les thread exécuté. Help xDIteration 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.
ps: l’exécution du sémaphore ne laisse passer que 3 threads en même temps.
C'est bon, j'ai resolu mon probleme
en fait, quand je fait :
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 =)
Code : Sélectionner tout - Visualiser dans une fenêtre à part printMessage("Processing completed by " + this.name + ".");
Merci pour le support
Partager