Thread d = new Thread(new Runnable() {
@Override
public void run() {
while(true);
}
});
d.start();
メソッド内のコードを変更せずに、無限ループを終了するにはどうすればよいですか public void run()
、 使用せずに d.stop();
(非推奨のメソッド)。
P.S:必要なすべてのエクササイズの詳細を公開することを好みます。彼らは私に時々無限ループの中に入る関数を与えました、そして、私はその方法を変えることができません。
回答:
回答№1は6メソッドpublic void run()内のコードを変更せずに、d.stop()を使用せずに、無限ループを終了するにはどうすればよいですか。 (非推奨のメソッド)。
これはある種のアカデミックな質問やインタビューの質問だと思います。スレッドコードを変更できない場合は、割り込みを追加できないか、 volatile
ブールチェック。そして、あなたは「電話することはできません .stop()
(これは非推奨であり、決して良い考えではありません)。
私が考えることができる唯一のものは、スレッドをデーモンスレッドに設定することです。
Thread d = new Thread(new Runnable() { ... });
...
d.setDaemon(true);
d.start();
デーモンを設定する必要があります 前 開始されました。 これはハックですが、おそらく質問の枠組み内です。これは、スレッドを即座に強制終了しませんが、最後の非デーモンスレッドが終了すると、スレッドはJVMによって強制終了されます。
もちろん、削除することもできます .start()
行ですが、それは質問の領域外です。 System.exit(0);
@MattBallが指摘したように、JVMもダウンさせますが、それは不正行為のようにも思えます。
回答№2の場合は3
スレッドを実行しているJVMを強制終了する以外は、ループを終了する方法がわかりません。
より良い方法は、少なくともスレッドの中断をチェックします:
Thread d = new Thread(new Runnable() {
@Override
public void run() {
while(!Thread.currentThread().isInterrupted());
};
d.start();
d.interrupt();
答え№3の2
できません。スレッドを非同期で停止する唯一の方法は stop()
方法。しかし、それなしでは、できません。
回答№4の場合は0
.stop()なしでは、スレッド自体のコードを変更する必要があります。こちらをご覧ください ここに いくつかのアイデアのために。
回答№5の場合は0
常に避ける while(true)
。試す while(running)
。その条件によってループの寿命が決まります。その後、running = falseに設定すると、ループの寿命が終了し、その後スレッドが終了します。