2010-12-07 12 views
1

Ich habe ein Programm, das mehrere Klassen ausführt. Ich möchte, dass eine Klasse mit der Ausführung aufhört, wenn eine Bedingung erfüllt ist, und NICHT den Rest des Codes ausführt, ohne die anderen Klassen zu löschen. Diese Klasse läuft auf ihrem eigenen Thread. ist das machbar?Kann eine Klasse beendet werden?

class A{ 
    private void method{ 
      if(condition == true){ 
      //terminate class 
      } 
    } 
} 
+6

', ohne das andere zu töten classes' bitte erklären, es –

+3

Aus Gründen der Pedanterie, Klassen haben keinen Lebenszyklus in diesem Zusammenhang; Objekte tun, und ja, es ist möglich, Objekte zu töten (Sie müssen dies tatsächlich GC überlassen) oder die Threads, in denen die Objekte verwendet werden, um die weitere Ausführung von Code zu verhindern. –

Antwort

3

Wenn Ihre Klasse in einem eigenen Thread läuft, tötet den Faden. Ich glaube nicht eine Klasse zu töten ist machbar in Java, was auch immer das bedeuten würde.

+0

Ich denke die Frage ist, wie man nur den aktuellen Thread tötet. – aioobe

+0

@aioobe: Ich gebe verschiedene Antworten für verschiedene Fragen ;-) – darioo

+0

@aioobe: "Ich denke die Frage ist, wie man nur den aktuellen Thread abtötet". Interessante Vermutung. Es wäre jedoch gut, die richtige Frage von @Ulkmun zu bekommen. Es sei denn, Sie haben etwas zusätzliches Wissen über die Frage. –

0

Eine Klasse kann weder ausgeführt, noch getötet oder beendet werden. Vielleicht sprechen Sie über Methoden. Das Einstellen einer flüchtigen booleschen Variablen kann dies erreichen.

class A{ 
    public volatile boolean terminate_me; 
    private void method{ 
     while (true) 
     { 
      if(terminate== true){ 
      //terminate method 
       return; 
      } 
     } 
    } 
} 

Wenn jemand terminate_me auf true gesetzt ist, wird das Verfahren zurück.

5

Ich bin nicht ganz sicher, was Sie zu tun versuchen, aber wenn die Aufgabe in einem eigenen Thread ausgeführt wird, und solange Bedingung eine Membervariable dieser Klasse ist, dann sollten Sie, wenn Sie die Bedingung auf false setzen gut. Etwas wie dieses:

public class Task implements Runnable { 

    private boolean stop = false; 

    private void stop() { 
     this.stop = stop; 
    } 

    @Override 
    public void run() { 
     while (!stop) { 
      // do it 
     } 
    } 

    public static void main(String[] args) { 
     Task task1 = new Task(); 
     new Thread(task1).start(); 
     Task task2 = new Task(); 
     new Thread(task2).start();  
     // some time later 
     task1.stop(); 
     // will stop task1, but not task 2 
    } 
} 
3

Ich rate Ihnen stark, Ihren Programmfluß und logischen Entwurf zu überdenken. Sie sollten "anmutig" stoppen und keine Threads beenden.


jedoch den aktuellen Thread zu töten Sie

Thread.currentThread().stop(); 

Die stop Methode allerdings für einen guten Grund ist veraltet tun könnte. Verwenden Sie mit Vorsicht.

1

Eine Option könnte sein, dass Ihr Objekt die GuavaService Schnittstelle implementiert. Es ist speziell für Dienste gedacht, die gestartet werden sollen und dann irgendwann heruntergefahren werden. Insbesondere möchten Sie möglicherweise Ihre Klasse erweitern AbstractExecutionThreadService. Dadurch wird sichergestellt, dass der Service für Sie in einem eigenen Thread ausgeführt wird. Dann brauchen Sie nur start() den Service und stop() den Service, wenn Sie es brauchen zu stoppen. Ihre Methode kann überprüfen, isRunning(), ob es fortgesetzt werden soll.

public class ClassA extends AbstractExecutionThreadService { 
    protected void run() { 
    while (isRunning()) { 
     ... 
    } 
    } 

    // Can also start shutdown in another method 
    private void method() { 
    if (condition == true) { 
     triggerShutdown(); 
     return; 
    } 
    } 
} 

Alles, was gesagt, ich bin genau nicht ganz klar, was Sie tun wollen, und wie Sie tatsächlich diese Klasse (oder Klassen), so ist es schwer zu sagen ist, wie dies für Ihre Situation funktionieren wird.

+0

kann 'AbstractExecutionThreadService' mehrere Threads erzeugen und verwalten, die die Klasse ausführen? – KJW

0

Wenn Sie die Ausführung stoppen möchten, sobald eine Bedingung erfüllt ist, müssen Sie diese Bedingung immer überprüfen. Es ist ein bisschen mühsam zu tun;

class A{ 
    private boolean exit_me = false; 
    private void method{ 
    if(!exit_me) 
     method1(); 
    if(!exit_me) 
     method2(); 
    if(!exit_me) 
     method3(); 
    if(!exit_me) 
     method4(); 
    // and so on 
    // will exit when all methods are executed or if exit_me is set 
    } 

    // implement method1, method2, method3, method4 etc... 
} 
Verwandte Themen