我一直在使用线程向链接发送GET请求(一切都很好)。但是,我需要它以异步方式运行,所以我创建了一个新线程并运行它。问题是我需要它在线程完成执行后返回值returnVar[0]
。我已尝试使用!thread.isActive
的while循环,但当然,方法体需要一个return语句。我已经尝试了你将要看到的CountdownLatche
,但是他们暂停了我不想要的主线程。非常感谢任何想法。
代码:
public String getUUID(String username) {
final String[] returnVar = {"ERROR"};
final CountDownLatch latch = new CountDownLatch(1);
Thread thread = new Thread(() -> {
final String[] response = {"ERROR"};
final JSONObject[] obj = new JSONObject[1];
response[0] = ConnectionsManager.sendGet("https://api.mojang.com/users/profiles/minecraft/" + username);
try {
obj[0] = (JSONObject) new JSONParser().parse(response[0]);
returnVar[0] = (String) obj[0].get("id");
} catch (ParseException e) {
e.printStackTrace();
}
latch.countDown();
});
thread.start();
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
return returnVar[0];
}
答案 0 :(得分:1)
我认为您应该考虑使用Callable
代替Runnable
。有关说明和示例,请参阅this thread。
此外,您使用CountDownLatch
一个帖子有点奇怪。锁存器有助于确保尽可能均匀地启动多个线程,而不是某些线程获得“开头”#。在一个更传统的创业公司。
答案 1 :(得分:0)
这是对Thread
s的不当使用。
您的代码与下面的代码完全相同:
public String getUUID(String username) {
String response = ConnectionsManager.sendGet("https://api.mojang.com/users/profiles/minecraft/" + username);
try {
return (String) ((JSONObject) new JSONParser().parse(response)).get("id");
} catch (ParseException e) {
return "ERROR";
}
}
有几个选项可以进行异步调用。
一个选项是使用CompletableFuture
:
CompletableFuture.supplyAsync(getUUID("username")).thenAccept(new Consumer<String>() {
@Override
public void accept(String response) {
// response of async HTTP GET
}
});
了解更多: