异步运行任务并在线程处于活动状态后返回

时间:2016-03-04 19:00:56

标签: java multithreading

我一直在使用线程向链接发送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];
}

2 个答案:

答案 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
    }
});

了解更多: