我正在从事多线程项目。我试图启动一个线程,我从某个类调用一些方法。这种方法可能需要很长时间(有些"而#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...
}
}
}
答案 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();