【发布时间】:2014-03-09 15:42:17
【问题描述】:
我希望能够等待线程从另一个类上完成的一些计算中返回一个值。让我发布一些代码:
public class ClassA implements Runnable{
public boolean threadRunning ;
public String value ;
public ClassA() {
...
}
public String getValueFromServer() {
//call to a method in the server that does some calculation
ClassB.sendPetitionToServer() ;
t=new Thread (this) ;
threadRunning = true ;
t.start();
return value
}
public void run()
{
while(threadRunning)
{
checkValue ()
}
}
public void checkValue () {
String value = ClassB.getInstance().getValue ;
if (value!=null) {
threadRunning = false ;
}
}
}
问题是,我怎样才能等待线程从 ClassB.SendPetitionFromToServer() 的方法中返回一个值? ClassB 方法填充该值,但必须进行一些需要时间(5-8 秒)的计算。 ClassB 不是 Runnable,是一个简单的类。也许我应该创建另一个存储值的类并通知 ClassA。
总结我的问题(也许是令人困惑,甚至我的方法只是愚蠢的)。
我正在开发一个 Java WebApp。我有一个实现 Runnable 接口的 ClassA。这个类有一个方法需要从另一个 ClassB 中检索一些信息,该方法需要执行一些需要时间的非常繁重的计算(从 MySQL 中检索一些信息,使用信息进行一些计算......)。在收到 ClassB 的响应之前,如何停止 ClassA 的方法?有什么办法吗?
提前致谢
【问题讨论】:
-
我不明白为什么要使用线程来处理繁重的工作,如果你仍然等到这个线程完成工作继续......
-
要了解更多关于@LuiggiMendoza 所说的话,谷歌线程安全。如果它引入了竞争条件,您的线程是不安全的。
-
@John 我不是在谈论竞争条件,我可以这样想:工人 A 可以做这项工作 W1 和 W2,但 W2 很重,所以我会打电话给工人 B处理 W2,但工人 A 必须等到工人 B 完成工作才能继续工作。换句话说,在这种情况下,您并没有解决性能问题,而是使用了额外的线程 =\.
-
@John 不,这是因为 OP 有这种奇怪的设计。如果工人 A 和 B 都修改和使用相同的资源,这将是一个竞争条件,这似乎不是 OP 状态的问题。
-
@John 我明白你的意思,但是如果你读到了这个问题,唯一要在这里打开一个新线程是因为 A 需要用来自 B 的值来满足这个变量,这个值只被检索到W2结束后。除此之外,没有必要使用另一个线程,除非其他一些工作可以分开并在 parallel 中完成。
标签: java runnable thread-sleep