どうでしょうスレッドJava?
-
21-08-2019 - |
質問
どうでしょう java.lang.Thread
Java?
解決
彼らはThread.stop()
を非推奨の理由について日によって、このスレッドを参照してください。 に。これは悪い方法であったと安全に一般的にスレッドを停止するために何をすべき理由について詳しく説明します。
彼らがお勧めの方法は停止するバックグラウンドスレッドを要求フラグとして共有変数を使用することです。この変数は、スレッドが終了要求する別のオブジェクトによって設定することができます。
他のヒント
一般的に、あなたがいない..
あなたは<それが使用してやっているものは何でも中断することを頼むのhref =「http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#interrupt%28%29」 REL = "noreferrer"> Thread.interrupt()(Javadocのリンク)する
javadocのある理由の良い説明は (Javaの技術情報リンク)する
Javaのスレッドが殺害されないが、停止のスレッドを行ってお 協力方法.スレッドを終了するスレッドを停止優雅に.
しばしば volatile boolean
分野で使われているスレッドを定期的にチェックが終了し設定時は、対応する値です。
I ない を使用 boolean
チェックかどうかのスレッド 終了.ご利用の場合 volatile
分野としての修飾、仕事の信頼性が合わない場合にはコードの複雑さ、代わりに使用その他のブロック法の内部 while
ループから起こることをコードす 終わらない ですので、少なくとも 時間 としておくと良いかもしれません。
一部のブロック図書館法の割り込みをサポートします.
各スレッドはbooleanフラグ 割り込みステータス とすることができるようになり利用しなければならない。を導入することができようになります:
public void run() {
try {
while (!interrupted()) {
// ...
}
} catch (InterruptedException consumed)
/* Allow thread to exit */
}
}
public void cancel() { interrupt(); }
ソースコードに適応したから Java並行処理で実際に.以降、 cancel()
メソッドはpublicに使うためには、別のスレッドがこのメソッドを呼び出すとしていました。
一つの方法は、クラス変数を設定し、センチネルとしてそれを使用することによるものである。
Class Outer {
public static volatile flag = true;
Outer() {
new Test().start();
}
class Test extends Thread {
public void run() {
while (Outer.flag) {
//do stuff here
}
}
}
}
上記の例では、真の外部クラス変数、即ちフラグ=設定。スレッドを「殺す」ためにfalseに設定します。
あなたがそれを行うことができますどのような方法があります。あなたがそれを使用していた場合でも、どちらかが悪いプログラマであるか、あなたは悪いプログラマによって書かれたコードを使用しています。だから、あなたは悪いプログラマであることや、この不正なコードを使用して停止する停止について考える必要があります。 他の方法がない場合は、このソリューションは、状況にあります。
Thread f = <A thread to be stopped>
Method m = Thread.class.getDeclaredMethod( "stop0" , new Class[]{Object.class} );
m.setAccessible( true );
m.invoke( f , new ThreadDeath() );
したいなら数多くの観測に基づき、コメントが蓄積されています。
- Thread.stop()はスレッドを停止させた場合のセキュリティマネージャが可能です。
- Thread.stop()は危険です。とはいえ、携わる方であれば、数々の環境やすい管理のコードを呼び出しが必要な場合があります。
- るわけにはゆきません停止めコンテナのワーカスレです。スケジュールを設定しますコードギャップの問題が指摘されているhang,(く)新しいデーモンスレッドおよびモニターで殺害されます。
- stop()新しく作成しThreadDeathの 呼び出し スレッドを起こするとエラーに適用されている必要があり 対象 thread.そのため、スタックトレースは一般的に価値がない.
- にJRE6,stop()チェックのセキュリティマネージャを呼stop1()が呼stop0().stop0()は、ネイティブコードです。
私はThread.stop()
に投票したい。
たとえばとして、あなたは(ネットワーク要求など)長期的な操作を持っています。 たぶん、あなたは応答を待っているが、それは時間と他のUIにナビゲートし、ユーザーを取ることができます。 彼は結果を取得しますと、それは完全に無用だと彼はエラーの数につながることができますコールバックをトリガするため、この待機中のスレッドは現在a)は無用b)の潜在的な問題である。
すべてのことを、彼はCPUが激しくなる可能性が応答処理を行うことができます。あなたはすべてのコードでif (Thread.currentThread().isInterrupted())
ラインを投げることができないので、あなたは、開発者としても、それを止めることはできません。
強制的に、それは奇妙なスレッドを停止することができないので。
質問はかなり曖昧です。あなたが意図した場合は、他のさまざまな回答が参考になるはずです「私はプログラムを書くのですかどのように私はそれをしたいときにスレッドが実行を停止するように」。あなたは「私は今、再起動できないと私は死ぬために特定のスレッドを必要とし、何月来サーバーとの緊急を持っている」を意味している場合でも、あなたはjstack
のような監視ツールを一致させる介入ツールを必要としています。
この目的のために私は jkillthread して作成しました。使用のための説明書を参照してください。
もちろん、あなたがいない、完全に信頼されるコードのいくつかの種類を実行している場合があります。 (私は個人的にアップロードされたスクリプトは私のJava環境で実行できるようにすることで、これを持っている。はい、どこでも鳴っセキュリティ警報ベルがあるが、それはアプリケーションの一部です。)この不幸な事例では、最初にすべての単なるスクリプト作成者に尋ねることで期待しているされていますブールの実行/ドントラン信号のいくつかの種類を尊重します。あなたの唯一のまともはフェイルセーフと言う、それは長く、いくつかのタイムアウトより走る、場合スレッドのstopメソッドを呼び出すことです。
コードはのThreadDeathエラーをキャッチすることができ(または明示的に投げる何でも例外)、そして紳士的なスレッドが行うことになっているようにそれを再スローではないので、しかし、これは、単に「まともな」、と絶対的ではありません。だから、一番下の行は、フェールセーフ絶対的ではありませんAFAIAです。
優雅にスレッドを殺すために方法はありません。
あなたがスレッドを中断しようとすることができ、1つのコモンズ戦略は、それ自体を停止するメッセージにポイズンピルにスレッドを使用することです。
public class CancelSupport {
public static class CommandExecutor implements Runnable {
private BlockingQueue<String> queue;
public static final String POISON_PILL = “stopnow”;
public CommandExecutor(BlockingQueue<String> queue) {
this.queue=queue;
}
@Override
public void run() {
boolean stop=false;
while(!stop) {
try {
String command=queue.take();
if(POISON_PILL.equals(command)) {
stop=true;
} else {
// do command
System.out.println(command);
}
} catch (InterruptedException e) {
stop=true;
}
}
System.out.println(“Stopping execution”);
}
}
}
BlockingQueue<String> queue=new LinkedBlockingQueue<String>();
Thread t=new Thread(new CommandExecutor(queue));
queue.put(“hello”);
queue.put(“world”);
t.start();
Thread.sleep(1000);
queue.put(“stopnow”);
はんを殺し、停止、中断するスレッド(またはチェックを考割り込みが発生する()など)のまま終了。
では簡単にできます。を利用できますループとともに(揮発性)boolean型変数内のrun()メソッド制御のスレッドを指定します。ご返却も可能でからアクティブスレッドのスレッドを停止します。
このようにす優雅にkillスレッド:).
試みが突然スレッドが終了されたもので、悪いプログラミング演習-実証の貧しい応募デザイン。すべてのスレッドは下記からダウンロードできま適用を明示的、暗黙のうちに同じプロセスの状態を余儀なくされお互いに協力で一貫した、それ以外はアプリケーションが、バグがするまで診断.そこで、責任の開発者への提供の確保などの整合性がよく明確な応募デザイン。
が適なソリューションのスレッド終端:
- 利用の揮発性フラグ
- 利用対のねじになります。interrupt()およびねじになります。中断した。
良いとの詳細な説明は、その問題の急激なスレッドが終了しての事例として、間違っていて、適なソリューションのスレッドを終了で、できるだけ早く送ってくださ
は、「スレッドを殺すこと」を使用する権利のフレーズではありません。ここでは、意志のスレッドの優美完了/終了を実装することができる一つの方法があります:
私が使用したRunnableます:
class TaskThread implements Runnable {
boolean shouldStop;
public TaskThread(boolean shouldStop) {
this.shouldStop = shouldStop;
}
@Override
public void run() {
System.out.println("Thread has started");
while (!shouldStop) {
// do something
}
System.out.println("Thread has ended");
}
public void stop() {
shouldStop = true;
}
}
トリガークラスます:
public class ThreadStop {
public static void main(String[] args) {
System.out.println("Start");
// Start the thread
TaskThread task = new TaskThread(false);
Thread t = new Thread(task);
t.start();
// Stop the thread
task.stop();
System.out.println("End");
}
}
私は、Androidで動作するように割り込みを取得していないので、私はこの方法を使用し、完璧に動作します:
boolean shouldCheckUpdates = true;
private void startupCheckForUpdatesEveryFewSeconds() {
Thread t = new Thread(new CheckUpdates());
t.start();
}
private class CheckUpdates implements Runnable{
public void run() {
while (shouldCheckUpdates){
//Thread sleep 3 seconds
System.out.println("Do your thing here");
}
}
}
public void stop(){
shouldCheckUpdates = false;
}