修改参数的值

时间:2013-12-13 15:56:52

标签: java multithreading arguments

我正在从事多线程项目。我试图启动一个线程,我从某个类调用一些方法。这种方法可能需要很长时间(有些"而#34;循环我无法控制),所以我会强制退出该循环来结束线程。但是我会使用线程类的方法(不是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(...)方法的参数值?

这里有一个解决方案,但我不喜欢,因为我必须将线程的课程传递给the 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...
        }
    }
}

3 个答案:

答案 0 :(得分: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内实例化,而不是将其公开给外界。

答案 1 :(得分:0)

我会使用Observable模式:http://docs.oracle.com/javase/7/docs/api/java/util/Observable.html

A可以实现Observable,而Someclass将实现Observer,并在收到的布尔值上同步自己的布尔状态。你仍然需要A.addObserver(SomeClass),但这是一个相当低的耦合。

可能有点过度设计(?),但至少可以轻松扩展。并且它提供了比while(布尔)方式更灵活的方式,以便您可以中断计算。

答案 2 :(得分: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()){
           ...
        }
    }
}

这意味着以下列方式与Thread进行交互:

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