スレッドでよく使用されるいくつかの API の詳細な説明: 結合と割り込み

1.join()

join メソッドは、マルチスレッドでスレッドを呼び出すことによる同期効果を実現するのに役立ちます (たとえば、a、b、c という 3 つのスレッドがあるとします)。

a では、スレッド b と c は 1 つの処理を非同期で実行するために開始されますが、 a は終了後も実行を継続することを期待しており、b と c を呼び出して開始した後、各スレッドの join メソッドを呼び出します。これは待機を意味します。実行後のコードは次のようになります。

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread() {
            @Override
            public void run() {
                System.out.println("我是线程1");
            }
        };
        Thread thread1 = new Thread() {
            @Override
            public void run() {
                System.out.println("我是线程2");
            }
        };
        thread.join();
        thread1.join();

        System.out.println("我是主线程");
    }

2.割り込み()

このメソッドは、スレッドの現在の状態に割り込むものとして理解できます。シナリオはいくつかあります: 通常、1 つのスレッドを使用して別のスレッドが実行されているかどうかを制御し、別のスレッドに通知する必要がある場合は、interrupt() を呼び出します。現在のスレッドの状態を判断するための、停止したスレッド内の判断ロジック。

  • sleep メソッドや yield メソッドの呼び出しなど、ブロック状態のスレッドを中断します。このとき、別のスレッドがスレッドの中断()メソッドを呼び出すと、interruptedException がスローされ、中断ステータスは に変更されます。間違い
  • 実行中のスレッドを中断するということは、スリープなどの状態ではなく、他のコードが実行されていることを意味し、このとき thread1.isInterrupted() の値が true に変更されます。
  • パークを中断します。パークは現在のスレッドをブロックします。スレッドの中断()を呼び出すと、スレッドは下向きに実行し続けることができます。ただし、パーク メソッドが下向きに実行し続けるかどうかは、現在のスレッド thread1.isInterrupted() が true かどうかによって決まることに注意してください。これは true であり、再度ブロックすることはできません。これは、スレッドが LockSupport.park() メソッドを一度呼び出し、別のスレッドがそのメソッドを中断した場合、そのスレッドが実行を継続するときに再度そのメソッドを呼び出すことを意味します。現時点では現在のスレッドの isInterrupted() が true であるためブロックされます。そのため、スレッドを再度実行したい場合は、最初の park() メソッドの後に Thread.Interrupted() を呼び出すことができます。) メソッドは、割り込みを変更するのに役立ちます。ステータスを false に設定して、park() メソッドを呼び出すときにプログラムが再度ブロックできるようにします。コードはおおよそ次のとおりです。
        public static void main(String[] args) throws InterruptedException {
            Thread thread = new Thread() {
                @Override
                public void run() {
                    LockSupport.park();
    
                    System.out.printf("当前打断状态为%s\n",Thread.interrupted());
                    
                    LockSupport.park();
                    System.out.println("dssdsds");
                }
            };
            thread.start();
            thread.interrupt();
    
        }

おすすめ

転載: blog.csdn.net/weixin_59244784/article/details/132762250