私はJavaに変換するいくつかの(Linux)Cコードを持っています。このコードには、ループループごとにOSからのTERM信号をチェックし、それ以外の場合はシグナルをブロックするメインループがあります。これは、ループ内で実行される各作業単位が完全に行われる(中間のTERMシグナルによって中断されない)ためです。Javaは、シグナルが停止するまで、作業単位を完了します
これは、Javaで実装するにはやや面白いと証明されています。私は動作するように見えるいくつかのテストコード(下)を考え出しましたが、それがいつもうまくいくかどうか、あるいは私がテストで「ラッキー」だったかどうかは分かりません。
これは私の質問です。はこの良いコードですか、時にはうまく動作するコードですか?
TL; DR:作業スレッドと、シャットダウンスレッドは、あなたはそれがあるべき期待するすべての場合に限り、シャットダウンフックが走った(完成)されるような一般的な同期方法
public class TestShutdownHook {
static int a = 0; /* should end up 0 */
static volatile int b = 0; /* exit together */
static boolean go = true; /* signaled to stop */
/*
* this simulates a process that we want to do completely
* or not at all.
*/
private static void doitall() {
System.out.println("start");
++a; /* simulates half the unit of work */
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
System.out.println("exception"); /* doesn't seem to happen */
}
System.out.println("end");
--a; /* the other half */
}
/*
* there can be only one
*/
private static synchronized void syncit (String msg) {
if (msg.equals("exit")) go = false;
if (go) doitall();
}
/*
* starts a thread to wait for a shutdown signal,
* then goes into the 'while go doit' loop
*/
public static void main(String[] args) throws InterruptedException {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
int n = 0;
System.out.println("Shutdown coming...");
syncit("exit"); /* can't happen while main is in syncit? */
System.out.println("Shutdown hook! " + a);
/* this isn't really needed, just lets us see "goodbye" */
while (b == 0) ++n;
System.out.println("adios..."+n);
}
});
while (go) {
syncit("loop");
// there needs to be something else in this loop
// otherwise, we will starve the shutdown thread.
// either of the two lines below seem sufficient
System.out.println("ok");
Thread.sleep(1);
}
System.out.println("goodbye");
b = 1;
}
}
? JVMが正常にシャットダウンするか、^ Cでシャットダウンした場合に、doitall()が完了するはずのexitシグナルには何の欠陥もありません。私はあなたがJavaのドキュメントを読んだと思います。 –
私はこれに関してかなりの数のグーグルでやっていました.JNIとsunについて多くの話題がありました。「Javaの方法は考えていません」とは言いませんが、私はこれを見つけませんでした私はいくつかの自己疑問を抱えていました。 –