並行プログラミング-ブロッキングスレッド状態の詳細な理解

LockSupportがブロックされた状態にスレッドを見ることができるので、ロックがブロックされた状態になります場合にのみ、私はメモリを得ることができないので、?ブロックされた状態、それにスレッドを作成する方法はありません一瞬思っ
ブロックさにビットトリガースレッドを発見しました
インターネット上のメソッドは次のように述べています:
(1)スレッドスリープ:スレッドをブロック状態にするThread.sleep(ロングミリ秒)メソッド。

(2)スレッド待機:Objectクラスのwait()メソッド、

(3)スレッドの礼儀、Thread.yield()メソッド

(4)スレッドの自己終了、結合()メソッド、

(5)サスペンド()メソッドとレジューム()メソッド
上記の方法ではスレッドがブロックされる可能性がありますが、ブロック状態になって初めてスレッドをブロックできると思います。あまりにもぎこちないかもしれません。この文は少し偏っていると思います。 、次の写真を覚えているので:
ここに画像の説明を挿入
本が間違っている可能性はありますか?
それを試してください

1.sleep()メソッド

 public static void main(String[] args) {
        new Thread(()->{
            try {
                System.out.println("正在睡眠");
                Thread.sleep(100000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"t1").start();
    }

スレッドを表示するには、jpsを使用します。スレッド
ここに画像の説明を挿入
のステータスを表示するには、jstackを使用します。
ここに画像の説明を挿入
ああ、TimeWaiting、スレッドはタイムアウト待機状態です。

2. waitメソッド

    Object o = new Object();
        Thread t2 = new Thread(() -> {
            synchronized (o) {
                try {
                    System.out.println("执行等待!");
                    o.wait();
                } catch (InterruptedException e) {

                }
            }
        }, "t2");
        t2.start();

        Thread.sleep(100000);
        o.notify();

ここに画像の説明を挿入
待機状態

3.同期(ブロック状態)

 Object o = new Object();
        new Thread(() -> {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (o) {
            }
        }, "t1").start();
        //让t2 先拿到锁,然后就一直处于wait状态,我们再来观察t1
        new Thread(() -> {
            synchronized (o) {
                try {
                    Thread.sleep(100000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "t2").start();

ここに画像の説明を挿入

4.参加する

  Thread t1 = new Thread(() -> {
            try {
                Thread.sleep(10000000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "t1");
        t1.start();
        //先让t1 跑起来 观察t2
        Thread.sleep(10);
        Thread t2 = new Thread(() -> {
            try {
                t1.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }, "t2");
        t2.start();

ここに画像の説明を挿入

5.収量

CPUタイムスライスを放棄する方法は、タイムスライスを放棄するには短すぎるため、操作が少し難しい

後で更新する方法を考えます

6.LockSupport

ここに画像の説明を挿入

    Thread t1 = new Thread(() -> {
            LockSupport.park();
        }, "t1");
        t1.start();
        Thread.sleep(100000);
        LockSupport.unpark(t1);

ここに画像の説明を挿入

結論:
最後のLockSupportは、以前のすべてのロックサポートを無効にすることができます。ブロッキング状態に入る場合のみ、ブロッキングスレッドと呼ばれます。

おそらくこの部分は明確に定義されていないので、深く掘り下げる必要はなく、理解するだけでよく、日々の開発でこの知識の部分を使用するべきではありません。

そして、あなたがスレッドをブロックしたい場合:スレッドをブロックする
役割を果たすことができます。

37件の元の記事を公開 賞賛6件 訪問4632件

おすすめ

転載: blog.csdn.net/littlewhitevg/article/details/105598192