0

我的应用程序中有一个初始化线程,它聚合并顺序运行多个子线程(检查必要的目录,检查 xml 文件是否可用等)。如果不满足要求,我希望我的程序安全终止。

这里应该使用什么方法?

  • 如果每个子线程都终止程序,如果他发现他的要求没有得到满足(例如在 java 中System.exit(0);),我认为这不是一个好习惯。

  • 我的另一个想法是每个线程在全局映射中设置一个布尔值。然后在初始化线程之后检查映射(但如果子线程 2 依赖于子线程 1,这将是一个问题)。好处是应用程序可以“软”终止

问题

因此,如果不满足启动要求,终止程序(约 6 kLOC 的中小型项目)被认为是良好做法。该概念应包括(至少)打印详细错误消息的可能性。


因为这个问题太宽泛了。我将它限制为 java 以减少它的广泛性。为了使它更复杂,我也会对包含并行性的概念感到高兴。

4

5 回答 5

1

它取决于每种语言,但我认为一个好方法是简单地运行一个预检查程序来检查一切是否正常。最后它会生成一个答案,如果答案是肯定的,你的主程序就会运行。换句话说,您的预检查实际上是调用您的主程序。

于 2013-09-04T15:51:12.900 回答
1

如果每个子进程都终止程序,如果他发现他的要求没有得到满足(例如在 java 中System.exit(0);),我认为这不是一个好习惯。

子进程如何终止主程序?我假设您正在谈论实际的操作系统进程。那些可以自行终止,并且主程序可以监视所有子进程的终止。当一个不成功的代码(1)退出时,主程序可以自行终止。

于 2013-09-04T16:03:29.187 回答
1

如果您只是调用一系列子例程,则让每个子例程true在成功和false失败时返回。

这些例程的调用者可以检查结果,并在任何例程失败时优雅地终止程序。

例如

bool b = true; // Indicates success of initialization sequence

if (b && !(b = initFoo()))
    ; // Log your failure

if (b && !(b = initBar()))
    ; // Log your failure

但我同意让给定的子程序终止应用程序不是一个好的选择。将决定权交给来电者。

于 2013-09-04T16:27:57.707 回答
0

System.exit(0) is traditionally used for successful termination. So anything other than 0 is probably a better choice.

But why not have each "subprocess" throw an exception that is handled by the main program? Setting a global has code smell.

于 2013-09-04T15:56:33.193 回答
0

让子进程退出并使用 java.lang.Process.exitValue() 检查返回。子进程的退出值应该是特定于错误的。

private static final int REQUIREMENT_1_NOT_MET = 1;
private static final int REQUIREMENT_2_NOT_MET = 2;

if (! checkRequirement1Conditions())
    System.exit(REQUIREMENT_1_NOT_MET);
if (! checkRequirement2Conditions())
    System.exit(REQUIREMENT_2_NOT_MET);

如果进程设计为继续运行(即,仅在不满足条件时终止),您可能需要忽略抛出的 IllegalThreadStateException。

于 2013-09-04T16:13:28.673 回答