2017-01-29 4 views
1

Ist es gut, in OnDestroy Thread.join aufzurufen? Oder sag dem Thread einfach, er solle aufhören und ihn verlassen?Soll ich thread.join in onDestroy() aufrufen

Zum Beispiel:

public class MyActivity extends Activity { 

    private Thread myThread; 
    private volatile boolean running = true; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     myThread = new Thread(new Runnable() { 
      public void run() { 
       while(running) { 
        // Do something 
       } 
      } 
     }); 
     myThread.start(); 
    } 

    public void onDestroy() { 
     super.onDestroy(); 

     running = false; 
     try { 
      myThread.join(); // Is it good to calling it here? Or just let it fininsh itself? 
     } catch(InterruptedException e){} 
    } 
} 

ich join() weiß Aufruf könnte den UI-Thread blockieren, aber was passieren würde, wenn die Aktivität vor dem Thread endet ohne join() Aufruf?
Was macht das System mit den Threads, nachdem die Aktivität zerstört wurde? Wartet es auf sie, stellt sie in den Hintergrund oder tötet sie?

+0

Nicht verwandt, aber make 'running' als' atomic' oder 'volatile'. Lesen Sie über Threads Sichtbarkeit –

+0

@EugenMartynov Danke für die Erinnerung. Ich vergesse fast, dass es in Java ein 'volatile' gibt. – Rio6

+0

IMO nicht Punkt in Berufung, in der Tat scheint es wie eine schlechte Idee - Blockierung der Haupt 'Thread', wenn Android dringend Ressourcen benötigt (http://StackOverflow.com/Questions/15962646/android-Thread-join-Causes-Anwendung- to-hang) –

Antwort

1

Nein, nicht. Thread.join() zerstört einen Thread nicht - er wartet darauf, dass er beendet wird. Dies könnte sehr lange dauern (oder für immer). Es sollte nur aufgerufen werden, wenn dies nicht dazu führt, dass die App nicht mehr reagiert (wenn es nicht im UI-Thread ist) und wenn Sie absolut nicht fortfahren können, ohne dass der Thread beendet ist. Keiner ist hier wahr.

+0

Also sollte ich einfach das 'running' Flag setzen und den Thread auch dann lassen, wenn er für immer läuft? – Rio6

+1

Der Zweck der running flag hier ist, den Thread zu zwingen, am oberen Rand der Schleife zu stoppen, richtig? Also ja, setz es einfach und mach weiter. Wenn es funktioniert, funktioniert es. Wenn dies nicht der Fall ist, würde thread.join nur die App einfrieren lassen. es würde den Faden nicht wirklich zum Anhalten zwingen. –

+0

Gibt es eine Möglichkeit zu wissen, ob es nicht funktioniert und läuft für immer, wenn ich 'Join()' nicht habe? – Rio6

Verwandte Themen