2013-12-13 44 views
1

我正在开发多线程项目。我试图启动一个线程,我从某个类调用一些方法。这个方法可能需要很长时间(一些“while”循环,我没有控制),所以我会强制退出该循环来结束线程。但我会使用线程类的方法(而不是java.lang.Thread,但他的儿子)来做到这一点。我知道如何在C/C++(通过引用传递SomeClass.SomeMethod的参数),但在Java中我不能(我认为)。修改参数的值

public class A extends Thread { 

    boolean isThreadClosing = false; 

    @Override 
    void run () { 
     // if it was C/C++ i can pass the arguments by reference 
     SomeClass.SomeMethod (isThreadClosing); 
    } 

    void stopThread () { 
     isThreadClosing = true; 
    } 
} 

public class SomeClass { 

    void SomeMethod (boolean isThreadClosing) { 
     while (!isThreadClosing) { 
      // do... 
     } 
    } 
} 

所以,问题是我怎么能具体化的方法SomeClass.SomeMethod(...)的参数值,从线程的类?

这里有一个解决方案,但我不喜欢,因为我不得不把线程的类传递给methood。

public class A extends Thread { 

    boolean isThreadClosing = false; 

    @Override 
    void run () { 
     // if it was C/C++ i can pass the arguments by reference 
     SomeClass.SomeMethod (this); 
    } 

    void stopThread () { 
     isThreadClosing = true; 
    } 

    boolean isClosing () { 
     return isThreadClosing; 
    } 
} 

public class SomeClass { 

    void SomeMethod (A thread) { 
     while (!thread.isClosing ()) { 
      // do... 
     } 
    } 
} 
+0

检查性病标志'interrupted'代替'isClosing' – Val

+0

除非我记错了,你试图达到的目标不会工作,因为你所在的“循环”不会因为“isThreadClosing”的值被改变而停止,所以一旦“循环”中的工作是“isThreadClosing”开始。那将是你得到你评论的地方// do ..通过这一点,所做的工作不会停止,因为'isThreadClosing'发生了变化,它会在'while'中完成整个代码。 –

回答

0

我会做一个简单的AtomicBoolean作为while语句的条件。

给出一个线程类:

public class ThreadA extends Thread { 

    private AtomicBoolean stop = new AtomicBoolean(false); 

    public void run(){ 
     someClass.someMethod(stop);    
    } 

    public void stopProcessing(){ 
     stop.set(true); 
    } 

} 


public class SomeClass { 

    public void someMethod(AtomicBoolean stop){ 
     while(!stop.get()){ 
      ... 
     } 
    } 
} 

这将意味着在下列方式线程交互:

ThreadA thread = new ThreadA(); 
thread.start(); 
... 
thread.stopProcessing(); 
0

你为什么不保持A作为SomeClass私有成员,然后将其设置当实例的SomeClass一个实例?这样你就不必将它传递给SomeMethod

public class SomeClass { 

    private A thread; 

    public SomeClass(A thread) { 
     this.thread = thread; 
    } 

    public void someMethod() { 
     while(!thread.isInterrupted()) { //why not use this instead of 
             //maintaining your own flag? 
      ... 
     } 
    } 
} 

但请记住这样的设计是种脆弱的,因为管理线程的生命周期中调用的代码和SomeClass之间现在分成。如果A只打算被SomeClass使用,那么最好在 SomeClass内实例化它,并且不要将其暴露给外界。

0

我会用可观察的模式:http://docs.oracle.com/javase/7/docs/api/java/util/Observable.html

一个可以实现可观测的同时SomeClass的将实施观测,并且对收到的布尔同步自己的布尔状态。你仍然需要A.addObserver(SomeClass),但这是一个非常低的耦合。

它可能有点过分设计(?),但它至少很容易扩展。它可以为您提供比while(布尔)方式更多的灵活性,以便您可以中断计算。