【问题标题】:Waiting for a thread result to return value on a method (Webapp)等待线程结果返回方法的值(Webapp)
【发布时间】: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


【解决方案1】:

您可以在线程上join(),然后从线程填充的变量中收集一个值。

但是我会改为调查Executors 和Futures,因此您可以通过Executor 生成线程,获取Future,然后调用Future.get()。这是从线程获取结果的更好、更高级别的机制。

【讨论】:

  • 非常感谢所有回答的人。我会检查所有的建议。我对线程完全陌生,所以我的代码肯定会很奇怪,但我会努力让它更好地看建议。谢谢布赖恩 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
  • 2017-06-02
  • 2019-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多