ホームページ  >  記事  >  Java  >  Java スレッド終了のいくつかの方法と分析例

Java スレッド終了のいくつかの方法と分析例

WBOY
WBOY転載
2023-04-27 10:31:071636ブラウズ

Java スレッド終了のいくつかの方法と分析例

#質問分析

答えは C

A: スレッドはスレッドを一定期間一時停止するために、sleep() メソッドを使用します。終了するには

B: 新しいスレッドを作成しても、前のスレッドには影響しません。

C: 例外がスローされ、スレッドは終了します。

D : これは終了ではなく、プリエンプションです。プロセスはリソース割り当ての最も基本的な単位です。同じプロセスによって作成された異なるスレッドはこれらのリソースを共有します。スレッドの優先度が高い場合、他のスレッドのリソースを占有します。他のスレッドが使用可能なリソースを持たなくなり、ブロックが発生します

スレッドが終了する 3 つの理由

#1. run メソッドが実行され、スレッドは正常に終了します

2. スレッドがキャッチされない例外またはエラーをスローする

#3 、スレッドの Stop メソッドを直接呼び出してスレッドを終了する (デッドロックが発生しやすいため、推奨されません)

詳細な分析

スレッドを終了する 3 つの方法

①フラグビットを使用してスレッドを終了

②stop メソッドを使用してスレッドを強制終了

③割り込みを使用して終了スレッド

1. フラグ ビットを使用してスレッド

一般 run() メソッドを起動します 実行後、スレッドは正常に終了しますが、一部のスレッドはサーボ スレッドであることがよくあります。これらは長時間実行する必要があるため、変数を使用してループを制御する必要があります。

定義終了フラグ exit. exit が true の場合、while ループは終了し、exit のデフォルト値は false ですexit を定義するときは、Java キーワード volatile が追加されます。このキーワードの目的は、exit を同期することです。exit の値を同時に変更できるのは 1 つのスレッドだけです。

public class ThreadSafe extends Thread {
  public volatile boolean exit = false; 
    public void run() { 
     while (!exit){
     //do something
     }
  } 
}

2. stop メソッドを使用します。スレッドを強制終了するには

プログラム内で直接 thread.stop() を使用してスレッドを強制終了することもできますが、stop メソッドは非常に危険であり、コンピュータをシャットダウンするのではなく、突然電源を切るようなものです。通常の手順に従ってください。予測できない結果が生じる可能性があります。主に安全ではありません。: thread.stop() が呼び出された後、子スレッドを作成したスレッドは ThreadDeatherror エラーをスローし、子スレッドによって保持されているすべてのロックを解放します。

3. 割り込みを使用してスレッドを終了する

スレッドが 2 つの状態にある場合、割り込みを使用して終了します

(1) スレッドはブロック状態ではありません。

isInterrupted() を使用して、ループを終了するスレッドの割り込みフラグを決定します。interrupt() メソッドを使用すると、割り込みフラグは true に設定されます。これは、カスタム フラグを使用してループを終了するのと同じです。ループを制御する

public class MyThread extends Thread {
    @Override
    public void run() {
        try {
            for (int i = 0; i < 500000; i++) {
                if (interrupted()) {
                    System.out.println("已经是停止状态了");
                    throw new InterruptedException();//中断异常
                }
                System.out.println("i=" + (i + 1));
            }
            System.out.println("我在for下面");
        } catch (InterruptedException e) {
            System.out.println("进run方法中的catch了!");
            e.printStackTrace();
        }
 
    }
}

(2) スレッドがブロックされた状態です。ソケット内の sleep メソッド、同期ロックの wait、receiver、accept などのメソッドが使用されている場合、interrupt() メソッドが使用されます。スレッドの名前は

public class ThreadInterrupt extends Thread {  
    public void run()  {  
        try {  
            sleep(50000);  // 延迟50秒  
        }  
        catch (InterruptedException e) {  
            System.out.println(e.getMessage());  
        }  
    }  
    public static void main(String[] args) throws Exception  {  
        Thread thread = new ThreadInterrupt();  
        thread.start();  
        System.out.println("在50秒之内按任意键中断线程!");  
        System.in.read();  
        thread.interrupt();  
        thread.join();  
        System.out.println("线程已经退出!");  
    }

以上がJava スレッド終了のいくつかの方法と分析例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。