【问题标题】:How to stop the current thread till other thread complete its execution?如何停止当前线程直到其他线程完成执行?
【发布时间】:2026-01-08 14:15:01
【问题描述】:

这是我的问题...

 public static String response = "";   

'

 public static String sendDataToServer(String data)
  {
    new Thread()  
    {
     public void run()
     {
     //sending data to server
     response = httpClient.execute(httppost, new BasicResponseHandler()).trim();
    }

    } .start();   

   return response;

  }

当我调用此方法时,我得到空字符串作为响应。

String res = sendDataToServer("my_data");  //res is always empty string
 //...XXXXXXX code after calling the method 

在完成 sendDataToServer() 方法的执行之前,总是会执行 XXXXX 代码。为什么 res 总是空的?我如何获得正确的响应字符串?如何在执行 sendDataServer() 方法之前停止正在执行的 XXXX 代码? 谢谢。

【问题讨论】:

  • 如果你真的想等待,不要启动线程,直接调用response = httpClient.execute(httppost, new BasicResponseHandler()).trim();即可。
  • 但您可能不想等待,因为它会因为违反 StrictMode 而出错或导致 ANR。在run 末尾调用一些方法来通知您的代码有关结果 - Handler 对此有好处。

标签: java android multithreading thread-safety


【解决方案1】:

你可以这样做:

Thread t = new Thread() {
    public void run() {
        //sending data to server
        response =
              httpClient.execute(httppost, new BasicResponseHandler()).trim();
    }
 };
 t.start();
 t.join();

这样你会等到线程结束,然后继续。

但是,请记住,等待线程完成在 Android 中是危险的,尤其是在 UI 线程(即主线程)中。但是,我假设这个线程不在 UI 线程中,否则 AsyncTask 会是更好的解决方案(并且更原生)。

【讨论】:

  • 这个答案虽然正确,但没有多大意义。如果您要立即加入,为什么要创建另一个线程?只需在父线程上执行代码即可。
  • 其实我想我得到了赞成票,因为AsyncTask 的评论。我也看不出这有什么意义。
【解决方案2】:

你可以使用join()来等待一个线程,但是由于你的线程,下面做同样的事情。

public static String sendDataToServer(String data) {
     //sending data to server
     return httpClient.execute(httppost, new BasicResponseHandler()).trim();
}

【讨论】:

    【解决方案3】:

    您可以使用CountDownLatch 来同步线程执行。作为文档中的立场, CountDownLatch 允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。如果启动 sendDataToServer 的线程是 UI 或主线程,这当然会导致您的应用程序响应出现问题。提供更多细节。

    【讨论】:

      最近更新 更多