当前位置: 首页 > 知识库问答 >
问题:

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

南宫兴德
2023-03-14

我一直在使用线程向链接发送GET请求(一切正常)。然而,我需要它异步运行,所以我创建了一个新线程并运行了它。问题是我需要它在线程执行完毕后返回值。我用尝试了while循环!线isActive,但当然,方法体需要一个return语句。我尝试了Countdownlock,您即将看到,但它们暂停了主线程,这是我不想要的。非常感谢您的任何想法。

代码:

    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个答案

洪越泽
2023-03-14

这是对线程的不当使用。

您的代码运行方式与以下代码完全相同:

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

了解更多信息:

  • http://www.javaworld.com/article/2078809/java-concurrency/java-concurrency-java-101-the-next-generation-java-concurrency-without-the-pain-part-1.html
百里泓
2023-03-14

我认为您应该考虑使用可调用的,而不是可运行的。有关说明和示例,请参阅此线程。

另外,有点奇怪的是,您将Countdownlock与一个线程一起使用。闩锁有助于确保多个线程尽可能一致地启动,而不是让一些线程在更传统的启动中“领先”。

 类似资料:
  • 问题内容: 是否有可能使MySQL中的行处于非活动状态?因此,该行不再用于查询结果吗?我的客户希望保留删除的成员在数据库中的存在,但是我不想编辑所有查询以检查该成员是否被删除。 还是有一种简单的方法将整个行数据移动到另一个“非活动”表中? 问题答案: 您可以重命名当前表,在其中创建“ deleted”列,然后创建一个与当前表同名的视图,并选择“ deleted = 0”。这样,您不必更改所有查询。

  • 问题涉及的方法是: 编辑。以下是完整的堆栈跟踪(一些消息是西班牙语的):

  • 我是JavaFx/并发的新手,所以我在JavaFX中阅读了并发教程,但是我仍然对JavaFX Gui中后台线程的实现有点困惑。 我试图编写一个与一些串行设备(使用JSSC-2.8)接口的小图形用户界面,并根据这些设备的响应更新图形用户界面。但是,在写入消息和设备响应之间有一个延迟,在任意的时间内使用Thread.sleep()对我来说不是一个可靠的编程方式。因此,我想使用并发包中的等待()和通知(

  • 问题内容: 我在一个比较大的Web应用程序上工作,后端主要使用PHP。代码中有几个地方需要完成一些任务,但是我不想让用户等待结果。例如,在创建新帐户时,我需要向他们发送欢迎电子邮件。但是,当他们按下“完成注册”按钮时,我不想让他们等到实际发送电子邮件之后,我只想开始该过程,并立即向用户返回一条消息。 到目前为止,在某些地方,我一直在使用exec()感觉像是被黑客入侵。基本上是这样的: 这似乎可行,

  • 问题内容: 从MDN for NodeList: 在某些情况下,NodeList是一个实时集合,这意味着DOM中的更改会反映在集合中。例如,Node.childNodes处于活动状态: 在其他情况下,NodeList是静态集合,这意味着DOM中的任何后续更改都不会影响集合的内容。document.querySelectorAll返回一个静态NodeList。 所以....有点烦!是否有任何关于哪些

  • 如何启动线程: 我调用关闭线程: