遼雪峰コンセプトJava11マルチスレッドプログラミング-1 -5割り込みスレッドのスレッド

1.割り込みスレッド:

  • スレッドが長時間タスクを実行する必要がある場合は、スレッドを中断する必要があるかもしれません。シーン:ネットワークから100Mダウンロードファイルは、ユーザーがダウンロードプロセス中にダウンロードタスクを中断します。
  • スレッドは、信号()メソッドを受信した後、実行の実行を終了する信号を送信スレッドに他のスレッドをスレッド割り込み

1.1割り込みスレッド

isInterruptedを検出する必要があります()マークは、他のスレッドは)(割り込みを呼び出すことにより、スレッドメソッドを中断します

class HelloThread extends Thread{
    public void run(){
        while(!isInterrupted()){
            System.out.println("Hello");
        }
    }
}
class Main{
    public static void main(String[] args) throws Exception{
        Thread t = new HelloThread();
        t.start();
        Thread.sleep(1000);
        t.interrupt();
    }
}

1.2割り込み保留スレッド

スレッドが待機状態にある場合、スレッドが例外:InterruptedExceptionをキャプチャします。通常、スレッドへの即時終了を実行する必要があり、下割り込み()メソッドを呼び出すことで、他のスレッドを説明するために例外:InterruptedExceptionをキャプチャします。

class HelloThread extends Thread{
    public void run(){
        while(!isInterrupted()){
            System.out.println("Hello");
            try{
                Thread.sleep(100);
            }catch (InterruptedException e){
                e.printStackTrace();
                return;
            }
        }
    }
}

1.3フラグ割り込みスレッドを実行している設定

class HelloThread extends Thread{
    public volatile boolean running = true;
    public void run(){
        while(running){
            System.out.println("Hello"); 
        }
    }
}
class Main{
    public static void main(String[] args) throws Exception{
        HelloThread t = new HelloThread();
        t.start();
        Thread.sleep(1000);
        t.running = false;
    }
}

スレッド間で共有変数は、スレッドは、変数の更新値を読み取ることができることを保証するために、揮発性のキーワードタグを使用する必要があり

、Java仮想マシン、変数の値は、メインメモリに保存されているが、スレッドが変数にアクセスすると、最初のコピーを取得しますそして彼らのワークメモリを節約します。スレッドの値が変数を変更する場合、変更された値を返すために、いくつかの点で仮想機会がメインメモリに書き込まれたが、今回は不明です。これは、変数、以前に別のスレッドによって読み取りまたは更新された変数を更新するスレッドの原因となります。

メインメモリの値がtrueであるため、スレッド1がfalseの値に書き換えられ、メインメモリへの書き込みが不確実時間後にスレッド2を実行する場合、仮想マシン1バックスレッドの値は、スレッド2読み取り値はまだスレッド1を更新し、真、偽ではないかもしれません。

volatileキーワードの目的は、仮想マシンに指示します:

  • たびに変数のアクセスは、常にメインメモリの最新の値を取得します
  • それぞれの直後にメインメモリに書き戻される変数を変更

volatileキーワードの可視性の問題が解決されます。

  • スレッドが共有変数を値を変更すると、他のスレッドは、直ちに変更後の値を見ることができます

例2

2.1割り込みは()このスレッドに割り込み

class InterrptThread extends Thread{
    public void run(){
        while(!isInterrupted()){
            System.out.println("Hello");
            try{
                Thread.sleep(100);
            }catch (InterruptedException ex){
                System.out.println("Interrupted!");
                break;
            }
        }
        System.out.println("Thread end");
    }
}
public class InterruptTest {
    public static void main(String[] args) throws InterruptedException{
        Thread t = new InterrptThread();
        t.start();
        Thread.sleep(1000);
        t.interrupt();
        System.out.println("main end");
    }
}

2.2使用フラグ割り込みスレッド

class InterrptThread extends Thread{
    volatile boolean running = true;
    public void run(){
        while(running){
            System.out.println("Hello");
            try{
                Thread.sleep(100);
            }catch (InterruptedException ex){
                System.out.println("Interrupted!");
                break;
            }
        }
        System.out.println("Thread end");
    }
}
public class InterruptTest {
    public static void main(String[] args) throws InterruptedException{
        InterrptThread t = new InterrptThread();
        t.start();
        Thread.sleep(1000);
        t.running = false;
        System.out.println("main end");
    }
}

3概要:

  • コール割り込み()メソッドは、スレッドを中断することができます
  • isInterruptedを()フラグを検出することにより、現在のスレッドが中断されているかどうかを取得します
  • 如果线程处于等待状态,该线程会捕获InterruptedException
  • isInterrupted()为true或者捕获了InterruptedException都应该立刻结束
  • 通过标志位判断需要正确使用volatile关键字
  • volatile关键字解决了共享变量在线程件的可见性问题

おすすめ

転載: www.cnblogs.com/csj2018/p/10994626.html