スレッドの瞬間的な「死」によって、(Throwable t)句が鳴らなくなることがあります。これはJavaでできますか?
いいえ不可能です。
JVMはOSスレッドを使用するため、基盤となるOSスケジューラに依存します。したがって、JVMレベルでは、JVMはJavaスレッドをプリエンプトできません。 Javaスレッドはボランティアで中断する必要があります。 (これは、一般的なケースだが、それでも、プラットフォームやJVM固有)
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
int i = 0;
i++;
}
}
});
t1.start();
Thread.sleep(1000);
t1.stop();
Thread.sleep(1000);
System.out.println(t1.isAlive());
}
上記のコードでは、stop()
が働いていた。しかし、あなたはwait()/sleep()
なしで無限ループがどのように見える理由を「一時停止するボランティアしません」不思議に思うかもしれません?
stop()
t1
でasynchronous exception
を上げるt1
スレッドがポーリングにより非同期例外を検出することができ
をJava Virtual Machine Specificationから:。。
stopメソッドは、特定のスレッドグループ内の別のスレッドまたはすべてのスレッドに影響を与えるために、あるスレッドによって呼び出される場合があります。これらのスレッドは、他のスレッドまたはスレッドの実行中の任意の時点で発生する可能性があるため、非同期です。内部エラーは非同期と見なされます
簡単な実装では、各制御転送命令のポイントで非同期例外をポーリングする可能性があります。
つまり、コンパイルされたコードでは、whileループの最後にjump
の前に、例外をポーリングするという指示があります。例外が存在する場合、t1
スレッドは例外ハンドラにジャンプし、それ自身で停止します。
スレッドがすべての例外を無視するようにし、スレッドが自己停止しない場合は、Javaスレッドを強制終了することはできません。ここで
はstop()
が動作しない例です:
public static void main(String [] args) throws InterruptedException {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
while (true) {
int i = 0;
i++;
}
} catch (Throwable e) {
e.printStackTrace();
}
}
}
});
t1.start();
Thread.sleep(1000);
t1.stop();
Thread.sleep(1000);
System.out.println(t1.isAlive());
}
方法について明示的にスレッドで 'OutOfMemoryError'を投げますか? –
"手動で"スローされた "OutOfMemoryError"が実際のOoMEとJVMで実際に同じ効果を持っているかどうかは分かりません。 OoMEに達するまでメモリを割り当てることが考えられるが、JUnitテスト環境も同様に破損する可能性があると主張できる。 – Alan47
または、非常に大きなファイルをロードしようとする。 OOMは再現が非常に簡単です。 – kosa