2010-12-07 62 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... 
}