2010-12-07 79 views
1

我有一個運行多個類的程序。我想讓一個類在條件爲真時停止執行,而不是在不殺死其他類的情況下執行其餘的代碼。這個類運行在它自己的線程上。這是可行的嗎?可能終止課程?

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

`不殺死對方classes`請解釋更 – 2010-12-07 17:57:18

+3

對於迂腐的緣故,類沒有在這種情況下一個生命週期;對象可以,對,可以殺死對象(實際上你必須把它留給GC)或者使用對象的線程來阻止代碼的進一步執行。 – 2010-12-07 18:05:02

回答

3

如果您的類在自己的線程中運行,請殺死該線程。我不認爲殺死一個類在Java中是可行的,無論這意味着什麼。

+0

我想問題是,如何只殺死當前線程。 – aioobe 2010-12-07 18:01:47

0

一個類既不能被執行也不能被終止。 也許你正在談論方法。設置一個易變的布爾變量可能會完成。

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

如果有人將terminate_me設置爲true,則方法將返回。

5

我不完全確定你想要做什麼,但是如果任務運行在它自己的線程中,並且只要condition是該類的成員變量,那麼當你設置條件爲false時,應該沒事的。類似這樣的:

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

我強烈建議您重新考慮您的程序流程和邏輯設計。你應該停止「優雅」而不是殺死線程。


然而,殺死當前線程,你可以做

Thread.currentThread().stop(); 

stop方法已經廢棄了一個很好的理由,但。謹慎使用。

1

這裏的一個選項可能是讓您的對象實現GuavaService接口。它專門用於打算啓動的服務,然後在某個時間點關閉。具體而言,您可能希望讓您的課程擴展AbstractExecutionThreadService。這將處理使服務在您自己的線程上運行。那麼你只需要start()服務和stop()服務,當你需要它停止。您的方法可以檢查isRunning()以查看是否應該繼續。

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

所有這一切說,我不是你想做的事,或者你如何實際使用這個類(或類)到底是什麼太清楚,所以很難說這將如何爲你的情況下工作。

0

如果您想在一些條件爲真時立即停止執行,那麼您總是需要檢查該條件。儘管這樣做有點乏味。

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... 
}