Javaのファイブをマルチスレッド:マルチスレッドの深さのトピック(エレガント停止スレッド)

記事のソースhttps://www.jianshu.com/p/744c4e65a3b3

記事対応するビデオソース:https://developer.aliyun.com/course/1012?spm=5176.10731542.0.0.6ef2d290hxQ4g0

複数行のマルチスレッドの動作の中で、あなたは、Threadクラスのstart()メソッドを使用して開始すると、複数のスレッドの処理を停止するために必要な場合には、Threadクラスは、元のstop()メソッドが、JDK1からこれらのメソッドを提供する場合。 2バージョンでは廃止されなかったが、今までは、もはやお勧めしますが、停止に加えて、()いくつかのアプローチがあるよりも無効にされているされています。

  • 停止マルチスレッド:公共の最終無効停止();
  • 破壊マルチスレッディングます。public voidが破壊();
  • ハングスレッド:公共の最終ボイド)(一時停止、一時停止。
  • 実行の中断されたスレッドを再開します。public最終無効履歴書を();
      離れて、これらの方法で行う理由は、これらの方法は非常に始まるJDK1.2から、もはや使用することは推奨されている、スレッドのデッドロックにつながることはできませんので、主な理由はあります。だから、それはソフトな方法で停止するスレッドのニーズを達成することである場合。
    例:実装スレッドソフトストップ
public class ThreadDemo {
    public static boolean flag = true;
    public static void main(String[] args) throws Exception {
        new Thread(() -> {
            long num = 0;
            while (flag) {
                try {
                    Thread.sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "正在运行、num = " + num++);
            }
        }, "执行线程").start();
        Thread.sleep(200);//运行200毫秒
        flag = false;//停止线程
    }
}

 

場合には、このフラグの内容を制御するために、他のスレッドがあり、スレッドを停止するには、この時間は、停止が即座に停止すると言うことではなく、完全にフラグの内容で判断を実行します。

デーモンスレッド

  今、雇用者は保護者、雇用者死んだ、ボディーガード無用を行ったときに、その後のボディーガードが生きている必要があります、ボディーガードがあるとします。そのため、複数のスレッドがプログラム内の他のスレッドが現在も実行のメインスレッドである場合、またはあれば言うことですつまり、デーモンスレッドを定義することができ、その後、デーモンスレッドは常に存在し、バックグラウンド状態で実行されます。
  Threadクラスで提供さデーモンスレッドを動作させる方法があります:

  • デーモンスレッドを設定します。public最後の無効は、setdaemon(上boolean)を、
  • 公共最終ブールisDaemon();:デーモンスレッドかどうかを決定する
    例:使用デーモン・スレッド
public class ThreadDemo {
    public static void main(String[] args) throws Exception {
        Thread userThread = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "正在运行、x = " + i);
            }
        }, "用户线程");//完成核心业务
        Thread deamonThread = new Thread(() -> {
            for (int i = 0; i < Integer.MAX_VALUE; i++) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "正在运行、x = " + i);
            }
        }, "守护线程");//完成核心业务
        userThread.start();
        deamonThread.setDaemon(true);//设置为守护线程
        deamonThread.start();
    }
}
}

  全体のJVMのGCスレッドの最大のがデーモンスレッドである、デーモンスレッドは、プログラムが終了した場合、デーモンスレッドが消え、ユーザーの周りのスレッドにあるすべての周りに見つけることができます。
  GCスレッドプログラムの実行は、常にプログラムが終了した場合は、GCスレッドも消えます、存在します。

volatileキーワード

  マルチスレッドの定義では、揮発性のキーワードは、主プロパティで使用され、このプロパティは、コピー処理のコピーを行うことなく、直接データ操作を表します。同期の性質の間違った理解にいくつかの本で。
  通常のプロセス変数は、次のようにいくつかの段階を通過する傾向があるとき:

  • データコンテンツ変数を取得し、
  • 変数のための数学的計算。
  • ;変数を算出した後、元の空間に保存された
      コピーを示す揮発性キーワード追加属性を使用しない場合は、しかし、コピーのコピー、再格納させるステップを節約に相当する元の変数、の直接操作。

class MyThread implements Runnable {
    private volatile int ticket = 5;//直接内存操作
    @Override
    public void run() {
        synchronized (this){
            while (this.ticket > 0) {
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "卖票,ticket = " + this.ticket--);
            }
        }
    }
}
public class ThreadDemo {
    public static void main(String[] args) throws Exception {
        MyThread mt = new MyThread();
        new Thread(mt, "票贩子A").start();
        new Thread(mt, "票贩子B").start();
        new Thread(mt, "票贩子C").start();
    }
}

 

公開された52元の記事 ウォン称賛7 ビュー10000 +

おすすめ

転載: blog.csdn.net/YKWNDY/article/details/104850151