2013-05-03 2 views
5

aufgetreten Wenn es eine Ausnahme während der Laufzeit eines Threads,Do Java Threads brauchen eine Bereinigung, wenn Ausnahmen

  1. Muss ich sonst bereinigen, oder was?
  2. Wenn ich Hunderte von Threads ausführen, kann ich Garbage Collector verwenden, um meinen Speicher zu bereinigen?

class MyThread extends Thread { 

    public void run() { 
     try { 
      MyDAO dao = new MyDAO(); 
      List<Results> res = dao.findResults(...); 
      .... 
     } catch(Exception e) { 
      //Do I need any clean up here 
     } 
    } 
} 

Antwort

5

Wenn die run Verfahren abgeschlossen ist, sei es auf eine Ausnahme der Regel oder durch alle Objekte, die es frei, schafft keine Notwendigkeit für eine bestimmte Bereinigungen werden garbaged.

Sie benötigen nur eine Bereinigung für die Ressourcen, die geschlossen werden müssen (DB-Verbindungen, Dateiströme usw.). Diese Bereinigung erfolgt normalerweise in einer finally Klausel nach Ihrer catch.

public void run(){ 
    Statement statement; 
    try{ 
     MyDAO dao = new MyDAO(); // doesn't need closing 
     List<Results> res = dao.findResults(...); 
     statement = getStatement(); // must be closed 
     .... 
    } catch (Exception e){ 
     // handle the error 
    } finally { 
     if (statement!=null) statement.close(); 
    } 
} 
+0

Danke für die saubere Antwort :) – sura2k

2

Objekte sind automatisch berechtigt Müll gesammelt, wenn sie keine weiteren Artikel haben, so lange, wie nichts von Threads wird von anderen Objekten referenziert wird, dann sollten Sie in Ordnung sein.

Es ist wichtig zu beachten, dass Javas Garbage Collection (unter Verwendung von System.gc()) nicht garantiert, dass die Garbage Collection stattfindet.

4

Sie brauchen keine bestimmte Aufräumarbeiten, es sei denn, Sie haben offene Systemressourcen Likes-Dateien. Sobald Threads beendet werden, egal ob normal oder außergewöhnlich, werden sie vom Betriebssystem oder der VM (Thread-Stack, ...) bereinigt.

Die Objekte Thread selbst werden vom normalen Java-GC zurückgewonnen. Im Allgemeinen führt GC eine Sammlung durch, wenn der Arbeitsspeicher knapp wird. Es ist jedoch nicht deterministisch.

Um verbessern die Speichereffizienz im Allgemeinen, könnten Sie Refactoring Threads in Aufgaben betrachten und einen Thread-Pool, die rund ein Megabyte (grobe Figur!) Rasiert off pro Thema:

  • Eine Implementierung von ExecutorService Führt Aufgaben für Threads aus. Wenn Sie hauptsächlich CPU-Arbeit und nicht I/O betreiben, ist es im Allgemeinen sinnvoll, so viele Threads wie Kerne als Hunderte von Threads zu verwenden. Es gibt vorhandene Implementierungen, Sie können jedoch auch einen eigenen Executor-Service implementieren.
  • Ein Callable<T> ist eine Task-Implementierung. Vielleicht ziemlich ähnlich zu dem, was Sie möglicherweise nicht mit Runnable Objekte tun.
  • Eine Future<T> hält ein Versprechen für ein Task-Ergebnis.