Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何停止当前线程直到其他线程完成其执行?_Java_Android_Multithreading_Thread Safety - Fatal编程技术网

Java 如何停止当前线程直到其他线程完成其执行?

Java 如何停止当前线程直到其他线程完成其执行?,java,android,multithreading,thread-safety,Java,Android,Multithreading,Thread Safety,这是我的问题 public static String response = ""; " 当我调用这个方法时,我得到的响应是空字符串 String res = sendDataToServer("my_data"); //res is always empty string //...XXXXXXX code after calling the method 并且总是在完成sendDataToServer()方法的执行之前执行XXXXX代码。为什么res总是空的?如何获得正确的

这是我的问题

 public static String response = "";   
"

当我调用这个方法时,我得到的响应是空字符串

String res = sendDataToServer("my_data");  //res is always empty string
 //...XXXXXXX code after calling the method 
并且总是在完成sendDataToServer()方法的执行之前执行XXXXX代码。为什么res总是空的?如何获得正确的响应字符串?在执行sendDataServer()方法之前,如何停止正在执行的XXXX代码? 谢谢。

您可以使用join()来等待线程,但由于您的线程已存在,以下操作也会执行相同的操作

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

Thread t = new Thread() {
    public void run() {
        //sending data to server
        response =
              httpClient.execute(httppost, new BasicResponseHandler()).trim();
    }
 };
 t.start();
 t.join();
这样,您将等待线程完成jsut,然后继续


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

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

如果您真的想等待,不要启动线程,只需调用
response=httpClient.execute(httppost,new BasicResponseHandler()).trim()立即。但您可能不想等待,因为它会因为违反StrictMode而出错,或者导致ANR。在
run
末尾调用某个方法,将结果通知给您的代码-这很好。这个答案虽然正确,但意义不大。如果要立即加入,为什么还要创建另一个线程?只需在父线程上执行代码。实际上,我想我得到了升级票,因为
AsyncTask
的注释。我也看不出这有什么意义。
Thread t = new Thread() {
    public void run() {
        //sending data to server
        response =
              httpClient.execute(httppost, new BasicResponseHandler()).trim();
    }
 };
 t.start();
 t.join();