【问题标题】:Set Java exit code without exiting yet设置 Java 退出代码而不退出
【发布时间】:2012-09-07 20:31:26
【问题描述】:

在具有大量关闭操作的高并发程序中,想知道如何设置退出代码而不提前调用 System.exit()?可以设置“在完成其他所有操作后执行此代码”方法吗?但我真的很想提前设置退出代码。

【问题讨论】:

  • @SJuan76 - 用它做什么?
  • 从您的问题来看,您似乎想在退出线程之前设置/存储退出值。静态变量用于存储值并在退出时检索它。看到您正在寻找关闭挂钩,现在我知道这不是这个主意。

标签: java shutdown exit-code


【解决方案1】:

如果我正确理解您想要以某种方式保留退出代码,请运行一些方法,然后使用预先确定的退出代码调用 System.exit
IMO 你应该做的是改用Shutdown hooks。 IE。您的代码将在 JVM 关闭之前运行,并且(如果我正确地满足了您的要求)将通过简单的编码实现获得相同的结果(即,而不是使用状态变量和不寻常的编码逻辑来实现您正在尝试做的事情等)

【讨论】:

  • 程序有关闭钩子;从其中一个调用 exit 是否不安全?听起来它会循环或非法或其他什么。
  • @djechlin:如果关闭钩子中的代码正在运行,则意味着JVM正在关闭。为什么要调用System.exit?只需使用您感兴趣的状态代码调用System.exit让它正常关机
  • 我明白了,把shutdown方法移到shutdown hook中,直接调用System.exit而不是shutdown hook中的方法。
  • 是的。这个想法是在关机时JVM 开始运行关机钩子。所以你在关机时需要的所有代码都应该放在那里。在适当的地方调用System.exit(一次使用您需要的代码)并让 JVM 开始以适当的方式运行挂钩。您的代码将在JVM 退出之前运行。
【解决方案2】:

让一个主线程派生出所有其他线程,这样它只有在所有其他线程完成时才会关闭。

【讨论】:

    【解决方案3】:

    在具有大量关闭操作的高度并发程序中

    这对我来说是一种代码味道。

    我可以理解多个线程可能想要关闭,但不应允许它们这样做。

    相反,我将创建一个名为initiateShutdown(int code) 的全局方法。此方法将包含确定何时适合实际关闭的逻辑。由于您可能不希望从该方法返回的线程,您可以实现某种永不返回的锁,并委托线程等待该锁。

    【讨论】:

    • “代码异味”是什么意思?是的,我确实有一个方法可以做到这一点,它会在所有需要关闭的对象上启动关闭,但是如果它在最后调用 System.exit,这些关闭将被中断。
    【解决方案4】:

    只需将结果存储在某处并使用任何合适的同步工具来告诉您已完成。完成后,只需读取存储的结果并使用 System.exit(result) 退出。

    我很好奇,如果多个线程设置结果,你应该使用哪个?

    【讨论】:

    • 什么“合适的同步工具”告诉我我已经完成了?第一个或最后一个,在这个程序设计中,目前只有一个是可能的。
    • 哪个工具取决于您的应用。你怎么知道你应该退出?
    • 在这种情况下,来自 MBean 的指令。
    • 抱歉不清楚。我ment:你怎么能说其他一切都完成了?
    • 这实际上正是我不知道的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多