Bonjour,
J'utilise ScheduledThreadPoolExecutor pour gérer un certain nombre de thread simultanément.
Je me demande si je peux définir une start date et end date pour commencer et finir la compilation ?
Merci.
Bonjour,
J'utilise ScheduledThreadPoolExecutor pour gérer un certain nombre de thread simultanément.
Je me demande si je peux définir une start date et end date pour commencer et finir la compilation ?
Merci.
La... compilation ?
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
Je fait plusieurs threads en même temps, et pour chaque intervalle je refaite la même procédure, ScheduledThreadPoolExecutor gère tout ça .. mais quand commencer? quand finir?
C'est clair?
Responsable Java de Developpez.com (Twitter et Facebook)
Besoin d'un article/tutoriel/cours sur Java, consulter la page cours
N'hésitez pas à consulter la FAQ Java et à poser vos questions sur les forums d'entraide Java
--------
Architecte Solution
LinkedIn : https://www.linkedin.com/in/nicolascaudard/
La compilation exécute ScheduledThreadPoolExecutor .. et je devrai spécifier quand commencer et quand finir, genre un TimerTask, startData et endDate.
Je comprends toujours pas ces histoires de compilation mais on va supposer que c'est sans importance.
En fait, est-ce que ce serait pas plus simple de commencer... Dès que tu as quelque chose à faire, hop ! Tu l'envoies au ThreadPoolExecutor ?
Pour finir, je dirais, quand tu arrêtes ton programmes, tu appelles le stop() du ThreadPoolExecutor, et tu laisses finir les tâches qu'il avait acceptées. Non ?
'Fin bon, il est toujours possible de définir un Timer qui s'occupera à un moment de créer le ThreadPoolExecutor et d'y envoyer les tâches à faire, puis un autre Timer pour appeler stop() sur ce même ThreadPoolExecutor. Mais bon.
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
Voici mon code:
On peut bien voir que il y a des variables start date et end date, j'aimerai bien definir la start date pour commencer le traitement de mes threads, et end date au lieu de wait();
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 import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class ProbeManager { private final Log log = LogFactory.getLog(ProbeManager.class); private final int poolSize; private final int numNetElems; public Date endDate; public Date startDate; public ProbeManager(int poolSize, int numNetElems) { this.poolSize = poolSize; this.numNetElems = numNetElems; DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); try { startDate = dateFormat.parse("06/26/2011 13:13:12"); endDate = dateFormat.parse("07/29/2011 12:55:12"); } catch (ParseException e) { e.printStackTrace(); } } public void processProbes(int loop) { log.debug("Starting to process probes"); ScheduledThreadPoolExecutor threadPool = new ScheduledThreadPoolExecutor( poolSize, Executors.defaultThreadFactory()); List<Probe> probes = new LinkedList<Probe>(); // 10 Probes for (int i = 0; i < numNetElems; i++) { Probe currentProbe = new Probe("probe-" + i); probes.add(currentProbe); threadPool.scheduleAtFixedRate(currentProbe, loop, loop, TimeUnit.SECONDS); threadPool.execute(currentProbe); } synchronized (this) { try { wait(60000); } catch (InterruptedException e) { log.error(e); } } log.debug("Times Up!"); threadPool.shutdownNow(); log.debug("----------------"); for (Probe probe : probes) { log.debug(probe + " executed " + probe.getCount() + " times"); } } }
C'est comme pour le RemindTask, on définit la start date end date! mais la j'aimerai pas intégrer un autre outil pour plus de simplicité..
tu peux utiliser scheduleWithFixedDelay pour faire entrer un job démarrage et un job fin. Dans le job démarrage tu met tous tes Probe dans le scheduler, dans le job de fin tu fais le schutdown du scheduler.
Mais vu ce que t'essaie de faire, je crois que l'api Quartz, qui est une api de gestion de jobs, est plus adaptée à tes besoins En plus, avec la persistence de son scheduler tu pourrais avoir ton application qui reprend là ou elle s'est arrêtée en cas d'interruption de service, ce qui est important si tu veux faire tourner des trucs sur un période de plusieurs semaines.
Merci pour l'aide, Je pense pour garder les choses simple, j'opte pour scheduleWithFixedDelay si c'est vraiment ce don't j'en ai besoin, mais je comprend pas comment vous proposez de l’implémenter puisque je peux pas fixer une start date et end date ..
Oui justrement, j'ai du mal répondu, j'ai effectivement un startDate et une endDate mais je sais pas comment les intégrer avec la méthode que vous proposez..
tout simplement
Code : Sélectionner tout - Visualiser dans une fenêtre à part long delay = endDate.getTime() - new Date().getTime();
Ca me retourne:
Exception in thread "main" java.lang.NullPointerException
at com.oghmasys.test.threadpool.ProbeManager.<init>(ProbeManager.java:33)
at com.oghmasys.test.App.main(App.java:16)
Une chose intéressante serait de lui passer des objets non-null, pour éviter une NullPointerException.
N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
Bon, désolé encore c'etait juste un bloc try catch qu'il fallai ajouter ..
Ca marche a priori pour la durée, mais pour startDate aucune idée comment l'integrer, puisque je veux commencer a une date donnée. Mais pour le moment mon programme tourne pour la durée souhaitée.
ben pour la startDate, c'est exactement la meme chose que pour la endDate
Bon je vois vraiment pas comment, puisque pour le delay, j'ai besoin de startDate et endDate et intégrer ce long dans le wait, puisque c'est la logique du threadpool, mais la startDate, je sais pas comment je peux utiliser une durée pour commencer mon exécution a une date donnée.
1) tu démarre (main) n'importe quand
2) tu démarre le pool
3) tu poste un job de démarrage avec un delay calculé pour qu'il colle à "startDate"
4) tu poste un job de fin avec un delay calculé pour qu'il colle à "endDate"
Fin du travail de ton main
4) ton job de démarrage s'exécute, il poste tous les jobs à faire
fin) ton job de fin s'exécute, il fait un schutdown du pool
J'ai résolu le problème simplement en ajoutant un schedule du timer qui a une startDate.
Merci bien pour le support
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager