我的应用程序中有一个初始化线程,聚合并顺序运行多个子线程(检查必要的目录,检查xml文件是否可用等)。如果不满足要求,我希望我的程序安全终止。
这里应该采用什么方法?
如果每个子线程终止程序,如果他发现他的要求不符合(例如在java System.exit(0);
中),我认为这不是一个好习惯。
我的另一个想法是每个线程在全局映射中设置一个布尔值。在初始化线程之后检查映射(但是如果子线程2依赖于子线程1则会出现问题)。好处是应用程序可以“轻柔地”终止
问题
因此,如果不满足起始要求,那么终止程序(大约6 kLOC的中小型项目)被视为良好做法。该概念应包括(至少)打印详细错误消息的可能性。
因为这个问题太宽泛了。我将它限制在java以减少它的广泛性。为了使它更复杂,我也会对包含并行性的概念感到高兴。
答案 0 :(得分:1)
这取决于每种语言,但我想一个好方法就是简单地运行一个预检程序,检查一切是否正常。最后它会生成一个答案,如果答案是肯定的,那么你的主程序就会运行。换句话说,您的预检是实际调用您的主程序。
答案 1 :(得分:1)
每个子进程是否应该终止程序,如果他找到了 我认为不符合要求(例如在java
System.exit(0);
中) 这不是一个好习惯。
子进程如何终止主程序?我假设你在谈论实际的操作系统进程。那些可以终止自己,主程序可以监视所有子进程的终止。当一个代码以不成功的代码(1
)退出时,主程序可以自行终止。
答案 2 :(得分: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
但我同意让一个给定的子程序终止应用程序不是一个好的选择。将该决定交给来电者。
答案 3 :(得分:0)
System.exit(0)
传统上用于成功终止。所以0
以外的任何东西都可能是更好的选择。
但为什么不让每个“子进程”抛出一个由主程序处理的异常?设置全局代码气味。
答案 4 :(得分: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。