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

使用thread.CurrentThread().Join()保持线程活动

长孙景焕
2023-03-14

在另一个主题中,thread.currentThread().join()thread.sleep()等Java解决方案中的thread.currentThread().join()的用户被认为是一些评论者可以接受的方法,但有一个评论者说,应该使用一些有用的方法来完成,这些方法可以使线程保持活动,而不是仅仅使它Hibernate。

我理解他的观点,但是如果没有什么事情可以使线程保持活动状态,就像这个例子,我订阅了一个“Topic like”以异步获取消息呢?

public static void main(String[] args) throws InterruptedException {
    WebClient client = WebClient.create("http://localhost:8082");
    ParameterizedTypeReference<String> type
            = new ParameterizedTypeReference<String>() {};

    Flux<String> eventStream = client.get()
            .uri("/messages")
            .retrieve()
            .bodyToFlux(type);

    eventStream.subscribe(
            content -> log.info("Message received {} at {}", content, LocalTime.now()),
            error -> log.error("Error receiving SSE: {}", error.getMessage(), error),
            () -> log.info("Completed!!!"));

    Thread.currentThread().join();
}

使用Thread.CurrentThread().Join()是“可接受的”情况吗?还是我缺少了什么,可以用其他方法来完成?

共有1个答案

万嘉石
2023-03-14

完全没有理由死锁自己的线程,除了一个:

如果JVM的所有仍然活动的线程都设置了'daemon'标志(这只是一个布尔标志,您可以为任何线程随意设置和清除;它的默认值为false),那么JVM将退出。

解决这个问题的一个很糟糕的解决方案是将主线程(可能没有守护进程标志),然后“永远死锁它”。

一些库可能已经为您设置了“方便”标志(换句话说,这是错误的)。正确的做法是一开始就不设置它,或者如果库是为了让你“有帮助”才设置它的。

然后,您可以让您的main在到达它的末尾时死去,而JVM将继续以同样的方式运输。

因此,只有两种方法可以实现“永久死锁”:

 类似资料:
  • 这是正确的吗?如果有,为什么会有?

  • 我在Go中有以下代码。Go使用超文本传输协议保持连接。因此,根据我的理解,不会创建新连接,因为Go语言使用默认的持久连接。 > 据我所知,HTTP持久连接一次只能发出一个请求,即第二个请求只能在第一次响应之后发出。然而,如果多个线程调用会发生什么?将在前一个请求得到响应之前是否发送另一个请求? 我假设服务器超时了客户端建立的任何保持活动的连接。如果服务器超时,那么下一次,它会建立新的连接吗?

  • 问题内容: 我需要使线程顺序。他们需要按以下顺序启动: 当D完成时,C可以完成,然后B,然后是A。 在这种情况下,最好使用线程或?为什么呢? 我的线程需要启动并打印消息,完成后需要打印。 问题答案: 由于您正在等待“其他”线程完成(即完成执行),因此是更好的选择。 的javadoc 简单地说: 等待该线程死亡。 然后,该机制相对简单: 要说明:您需要参考。因此,指向,指向,指向和不指向任何对象(它

  • 我正在设置一个服务器(Radius)的模拟器(用于测试),它使用线程将查询发送到另一个服务器(LDAP)。查询需要以每秒x的速度执行。为此,我使用了一个带有callable的调度线程池执行器,这样我就可以创建callable并将它们提交给线程池执行。每个线程都应该打开自己的连接并使用它进行查询。问题是,每次使用连接时,我都希望相同的线程重复使用它。 澄清: 如果我有一个20个线程池,我希望创建和使

  • 问题内容: 我用来登录远程服务器。 问题 : 当我在工作场所时,它始终保持连接并且可以正常工作。不幸的是,在我在家中与远程服务器连接后,终端会在10到15分钟内死机。 控制台上没有错误/超时报告,但是光标不能再移动了。 输入检查登录用户时,那里有一些僵尸登录用户,我必须手动将其杀死。 这很烦人。谁能帮我? 问题答案: 在客户端运行的ssh守护程序(sshd),如果客户端变为静默(即,不发送信息),

  • 问题内容: 我正在尝试连接到API,对用户进行身份验证,然后查看用户详细信息。这是通过首先访问登录端点来完成的 登录,然后单击以下内容查看用户详细信息: 所有这些都可以在Web浏览器中使用。但是,一旦我尝试使用Curl,登录就可以正常工作,但是在尝试查看用户详细信息时,我又得到了401未经授权的错误。我相信这是因为Curl没有正确保存会话cookie?有人可以指出为什么它不起作用以及如何解决吗?我