Java: Set timeout pour les threads dans un pool de threads

Je veux définir les délais pour les threads qui sont exécutés à l'intérieur d'un pool de threads. Pour le moment j'ai code suivant:

ExecutorService executor = Executors.newFixedThreadPool(8);
for(List<String> l: partition) {            
    Runnable worker = new WorkerThread(l);
    executor.execute(worker);
}       

executor.shutdown();
while (!executor.isTerminated()) {

}

Le code divise une grande liste d'objets dans des sous-listes et les processus de ces sous-liste à l'intérieur d'un fils. Mais ce n'est pas le point.

Je veux donner à chaque seul thread dans le pool de threads d'un délai d'attente. Pour un seul thread à la piscine, j'ai trouvé la solution suivante:

Future<?> future = null;

for (List<String> l : partition) {
    Runnable worker = new WorkerThread(l);
    future = executor.submit(worker);
}

try {
    System.out.println("Started..");
    System.out.println(future.get(3, TimeUnit.SECONDS));
    System.out.println("Finished!");
} catch (TimeoutException e) {
    System.out.println("Terminated!");
}

Mais ce ne serait pas travailler pour plus d'un thread. Peut-être que je dois mettre chaque thread dans un List<Future> liste et de parcourir cette liste et définir un délai d'attente pour chaque future objet?

Des suggestions?

MODIFIER APRÈS l'UTILISATION de CountDownLatch:

CountDownLatch doneSignal = new CountDownLatch(partition.size());
List<Future<?>> tasks = new ArrayList<Future<?>>();
ExecutorService executor = Executors.newFixedThreadPool(8);
for (List<String> l : partition) {
    Runnable worker = new WorkerThread(l);
    tasks.add(executor.submit(doneSignal, worker));
}

doneSignal.await(1, TimeUnit.SECONDS);
if (doneSignal.getCount() > 0) {
    for (Future<?> fut : tasks) {
    if (!fut.isDone()) {
        System.out.println("Task " + fut + " has not finshed!");
        //fut.cancel(true) Maybe we can interrupt a thread this way?!
    }
    }
}

Fonctionne bien jusqu'à présent.

Alors, la prochaine question est de savoir comment interrompre un thread qui est expiré? J'essaie fut.cancel(true) et ajouter la suite de construire dans certaines critiques les boucles dans le thread de travail:

if(Thread.interrupted()) {
    System.out.println("!!Thread -> " + Thread.currentThread().getName() + " INTERRUPTED!!");
        return;
}

De sorte que le thread de travail est "tué" après l'expiration du délai. Est-ce une bonne solution?

En outre: Est-il possible d'obtenir le nom du thread qui a expiré au cours de la Future interface? Pour le moment j'ai l'impression de le nom dans la si la condition de la Thread.interrupted() construire.

Merci pour l'aide!

Ce qui concerne

Oui, il fonctionne pour en savoir plus, il suffit de garder à Terme dans une Liste.
S'il vous plaît ne pense pas que sur les fils de cette façon. Il y a quelque chose qui est fait, et que vous voulez un délai d'attente si il faut plus d'une certaine quantité de temps. Ce n'est pas tout ce thread pourrait arriver à faire ce travail, c'est le . Peut-être que les deux fils sont de la coopération sur le travail. Peut-être pas de thread est en train de travailler sur ce travail à l'époque. Mais c'est le vous voulez arrêter ou de délai d'attente ou que ce soit, de ne pas le fil ou les fils qui pourraient ou ne pourraient pas arriver à travailler sur elle. Ce subtil vue décalage est important de penser correctement sur les threads de sorte que vous vous retrouvez avec de bonnes conceptions.
bon point cependant, il peut y avoir des situations n'étaient que des travaux sont complètement indépendants l'un de l'autre. Je ne sais pas si l'OP en fait si à ce sujet, mais il semble que c'est le cas ici.
Il n'est pas sur la relation entre les œuvres les unes aux autres. C'est à propos de la notion de "travail" (la chose qui doit être fait) étant distinct de la thread(s) qui le font. Si le travail est en attente pour quelque chose, pas de fil peut être associé avec lui. Si le travail peut être fait simultanément, plusieurs threads peuvent coopérer pour faire. Lorsque vous êtes en attente pour l'exécution de certains travaux, vous ne devriez pas penser à ce fil ou des fils, le cas échéant, de travailler sur elle.

OriginalL'auteur sk2212 | 2013-01-09