/ /スレッド内の無限ループの停止-Java、マルチスレッド

スレッド内で無限ループを止める - java、マルチスレッド

    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に設定すると、ループの寿命が終了し、その後スレッドが終了します。