2012-05-02 3 views
6

Je suis nouveau sur Java et j'utilise un code donné par quelqu'un. Là, à la fin du code, ils interrompent un thread s'il n'a pas fini. Je mesure le timing du code.java: interrompre le thread absolument nécessaire

Le problème est que le code Java émet d'abord tous les threads, puis à la fin il interrompt. L'interruption est-elle nécessaire? Ne pouvons-nous pas attendre que tous les fils finissent réellement? Ou peut-être simplement interrompre l'interruption (ces threads exécutent des processus en utilisant la commande process exec et ils finiront quand même). Voici le code pertinent. Tout d'abord le code de fil individuel:

String commandString = "./script.scr "; 
    process = Runtime.getRuntime().exec(commandString); 
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    while ((lsString = bufferedReader.readLine()) != null) 
     { 
      System.out.println(lsString); 
     }  
     try 
     { 
      process.waitFor(); 
     } 

Maintenant, le code de la partie qui envoie ces fils:

public void stopWhenAllTaskFinished() 
{ 
    while(notFinished) {sleep(50);} //notFinished is class variable and somewhere else it will set to false. 
    //now finished. 
    //Interrupt all the threads 
    for (int i=0; i<nThreads; i++) { 
     threads[i].interrupt(); 
    } 
} 

Cette fonction est appelée de classe principale comme:

obj.stopWhenAllTaskFinished() 

J'ai beaucoup apprécier tout aperçu ou réponse.

+5

Malheureusement votre description est trop vague. L'interruption peut être nécessaire ou non. Tout dépend de ce que fait le 'Thread'. – Frankie

+0

J'ai ajouté le code correspondant – user984260

+1

Honnêtement, il ressemble à un chèque paranoïaque pour quelque chose qui n'arrive jamais. – trutheality

Répondre

1

On ne sait pas si les interruptions sont nécessaires à partir du code que vous avez posté.

  • Si notFinished est réglé sur false lorsque tous les threads ont terminé, alors les interruptions ne sont pas nécessaires.

  • Si notFinished est réglé sur false quand il est possible que certains fils ont pas fini, alors il pourrait être nécessaire. Que cela soit réellement nécessaire dépend d'autres choses:

    • Êtes-vous prêt pour l'application à attendre que les fils finissent naturellement?
    • Pouvez-vous être sûr que les fils finiront? (Pouvaient-ils se bloquer/bloquer pour toujours?)
    • Avez-vous besoin des résultats de leur activité?
    • Répondront-ils à une interruption? (Dans ce cas, je pense que la réponse est "oui".)
    • Y a-t-il un mal à laisser les fils là? (Par exemple, est-il arrêter l'application arrêter?)
+0

1. Oui, je suis prêt. 2. Oui, ils finiront sûrement. 3. Non, je ne fais que le temps de l'application globale (chaque tâche effectuée sur le thread prend du temps, mais si elle est interrompue: ce n'est pas bon). 4. Oui 5. Je ne sais pas s'il y a un danger. Ma seule exigence est: aucun thread ne doit être tué avant la fin et l'application globale. devrait se terminer seulement quand tous les fils finissent. – user984260

+0

"Si notFinished est défini sur false lorsque tous les threads sont terminés." Je pense que ce n'est pas le cas. notFinished est modifié avant que tous les threads ne soient terminés – user984260

+1

Answer 3 signifie que les interruptions pourraient effectivement être dangereuses. –

2

Le code suivant qu'Oracle fournit dans les javadocs est ce que la plupart des gens font. AFAIK, ceci est conçu pour tuer les threads qui refusent d'arrêter gracieusement après leur avoir donné une chance de fermer.

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html

void shutdownAndAwaitTermination(ExecutorService pool) { 
    pool.shutdown(); // Disable new tasks from being submitted 
    try { 
    // Wait a while for existing tasks to terminate 
    if (!pool.awaitTermination(60, TimeUnit.SECONDS)) { 
     pool.shutdownNow(); // Cancel currently executing tasks 
     // Wait a while for tasks to respond to being cancelled 
     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) 
      System.err.println("Pool did not terminate"); 
    } 
    } catch (InterruptedException ie) { 
    // (Re-)Cancel if current thread also interrupted 
    pool.shutdownNow(); 
    // Preserve interrupt status 
    Thread.currentThread().interrupt(); 
    } 
} 
+1

Cela concerne un pool de threads - la question d'origine n'utilise pas de pool de threads –

+0

Oui, le code utilise: des threads PoolWorker [] privés. Pouvez-vous indiquer le code approprié pour cela (ou donner un re ference). – user984260

+0

Désolé, j'ai posté ceci avant qu'il ait posté n'importe quel code. Je vais regarder dans la nouvelle question. – Jon7

Questions connexes