Bonjour,

J'aurais besoin d'aide, non pas pour une question de code, mais plus une question de modélisation et algo :

Je fais un client pour une appli réseau, et je dois communiquer avec tous les autres clients que je rencontre.
Pour ça, je crée un thread par client rencontré, et je place tous ces threads dans un ThreadPoolExecutor, qui me gere les starts.

Jusqu ici, mes threads étaient standalone, c'est à dire qu'une fois qu'ils étaient instanciés et placé dans la méthode execute du threadpool, je ne m'en occupait plus, et ils se débrouillaient tout seuls.

Mon problème, c'est que maintenant j'aimerais pouvoir avoir la main dessus, pour pouvoir lancer a un instant T une action simultanée pour tous les clients avec lesquels j'ai réussi a rester connecté, dans la limite donnée a mon threadpool.

(note : je ne fais pas un machin de hack ou allez savoir quoi, donc pas besoin de dévier le sujet )

Plus concretement : j'ai 20 clients en mode run, avec qui le handshake s'est passé convenablement, et je voudrais lancer une requete a tous ces clients.

Donc j'aimerais avoir la main dessus, sauf que ce sont 20 clients parmis 4000, dont peut etre 100 qui ont été terminés, et le reste qui se trouve dans la blocking queue du threadpool.

Je ne sais pas du tout comment faire, étant donné que mes connaissances en Java ne se limitent qu'aux api de base.

Je pensais faire un tableau de weak references des instances de thread, ce qui fait que seules les 20 premieres references sont celles qui sont en mode run, mais au niveau du tableau, je ne sais pas du tout comment il réagit quand sa case vient de disparaitre, et puis je ne pense pas que ce soit tellement propre non plus.

Voila, j'espere que qqun aura une idée, et aussi que j'ai été assez explicite.

Je met tout de même mon bout de code, bien que je ne pense pas que ça apporte grand chose :
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
 
// methode run()
    while (gRun)
    {
      PeerNode ptmp;
      byte[] btmp;
 
// autres initialisations
 
      for (int i = 0; i < mPeerIDList.size(); ++i)
      {
        btmp = mPeerIDList.get(i);
        if (!gContactedPeers.contains(btmp))
        {
          try
          {
// partie qui nous interresse -->
            ptmp = new PeerNode(btmp);
            gPeerThdPool.execute(ptmp);
            gContactedPeers.add(btmp);
// <--
          }
          catch (Exception ei)
          {
            Log.println("Peer ID corrupted or Peer unreachable : " + ei.getMessage());
            gCorruptedPeers.add(btmp);
          }
        }
      }
  }