2012-05-02 13 views
6

Jestem nowy w Javie i używając kodu podanego przez kogoś. Tam, na końcu kodu, przerywają wątek, jeśli jeszcze nie skończył. Zmierzam czas kodu.java: przerywa wątek absolutnie konieczny

Problem polega na tym, że kod Java najpierw wywołuje wszystkie wątki, a następnie na końcu przerywa. Czy przerywanie jest konieczne? Czy nie możemy poczekać, aż wszystkie nici się skończą? Lub może po prostu pomijać przerywanie (te wątki uruchamiają procesy za pomocą polecenia exec exec, a one i tak się skończą). Oto odpowiedni kod. Pierwszy kod dla pojedynczego wątku:

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(); 
     } 

Teraz kod części, która wysyła te wątki:

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(); 
    } 
} 

Ta funkcja jest wywoływana z głównej klasy jak:

obj.stopWhenAllTaskFinished() 

ja wielce doceń wszelkie wgląd lub odpowiedź.

+5

Niestety Twój opis jest zbyt ogólnikowe. Przerwa może, ale nie musi być potrzebna. Wszystko zależy od tego, co robi "Wątek". – Frankie

+0

Dodałem odpowiedni kod – user984260

+1

Szczerze mówiąc, wygląda to jak paranoiczna kontrola czegoś, co nigdy się nie zdarza. – trutheality

Odpowiedz

1

Nie jest jasne, czy potrzebne są przerwania od kodu, które zostały zaksięgowane.

  • Jeśli notFinished jest ustawiony na false gdy wszystkie wątki są gotowe, a następnie przerwania są zbędne.

  • Jeśli notFinished jest ustawiony na false gdy istnieje możliwość, że niektóre wątki nie zostały zakończone, to może być konieczne. To, czy rzeczywiście jest to konieczne, zależy od innych czynników:

    • Czy jesteś przygotowany, aby aplikacja oczekiwała na zakończenie wątków?
    • Czy możesz być pewny, że gwinty zakończą się? (Czy mogą się zawiesić/zablokować na zawsze?)
    • Potrzebujesz wyników swojej działalności?
    • Czy zareagują na przerwanie? (W tym przypadku myślę, że odpowiedź brzmi "tak".)
    • Czy jest jakakolwiek szkoda w pozostawieniu nici? (Na przykład, to zatrzymaj aplikację zamykania?)
+0

1. Tak, jestem przygotowany. 2. Tak, na pewno się skończą. 3. Nie, ja tylko czas ogólnego zastosowania (każde zadanie wykonane na wątku zajmuje trochę czasu, ale jeśli zostało przerwane: nie jest dobre). 4. Tak 5. Nie wiem, czy istnieje szkoda. Moim jedynym wymaganiem jest: żaden wątek nie powinien zostać zabity przed zakończeniem i ogólną aplikacją. powinien kończyć się dopiero po zakończeniu wszystkich wątków. – user984260

+0

"Jeśli opcja nie została ustawiona na false, gdy wszystkie wątki się skończą ..." Myślę, że tak nie jest. notFinished zmienia się przed zakończeniem wszystkich wątków – user984260

+1

Odpowiedź 3 oznacza, że ​​przerwania mogą być szkodliwe. –

2

Następujący kod, który zapewnia Oracle w javadocs, to, co większość ludzi robi. AFAIK, jest przeznaczony do zabijania wątków, które odmawiają zamknięcia z wdziękiem, po daniu im szansy na zamknięcie.

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

Jednak dla puli wątków - oryginalne pytanie nie używa puli wątków –

+0

Tak, kod używa: prywatnych wątków PoolWorker []. Czy możesz podać odpowiedni kod dla tego (lub dać re ference). – user984260

+0

Przepraszam, opublikowałem to zanim opublikował jakiś kod. Zajrzę do nowego pytania. – Jon7

Powiązane problemy