Java Exchangerは必ず

3304 ワード

JavaのExchangerを知っていますか.その特徴と応用シーンを簡単に話しますか?
答え:ExchangerはJDK 1.5から提供されている2つの作業スレッド間でデータを交換するためのカプセル化ツールクラスです.簡単に言えば、1つのスレッドが一定のトランザクションを完了した後、別のスレッドとデータを交換したい場合、最初にデータを取り出したスレッドは、2番目のスレッドがデータを持って来るまで対応するデータを交換するのを待っています.Exchangerの汎用タイプとして定義され、Vは交換可能なデータ型を表し、対外的に提供されるインタフェースは簡単で、具体的には以下の通りである.
  • Exchanger():無パラメトリック構造方法.
  • V exchange(V v):は、現在のスレッドが中断されない限り、別のスレッドがこの交換点に到達するのを待って、所定のオブジェクトをスレッドに転送し、スレッドのオブジェクトを受信する.
  • V exchange(V v, long timeout, TimeUnit unit):は、現在のスレッドが中断されているか、または指定された待ち時間を超えていない限り、別のスレッドがこの交換ポイントに到達するのを待ってから、指定されたオブジェクトをスレッドに転送し、スレッドのオブジェクトを受信する.
    1つのスレッドがexchange呼び出しポイントに到達すると、他のスレッドがこのメソッドを呼び出していた場合、他のスレッドは起動され、オブジェクト交換され、それぞれ返されるようにスケジューリングされます.他のスレッドがまだスイッチポイントに達していない場合、現在のスレッドは、他のスレッドが到着するまでスイッチが完了して正常に戻るか、現在のスレッドが中断またはタイムアウトして返されるまで保留されます.
    public class Test {
        static class Producer extends Thread {
            private Exchanger exchanger;
            private static int data = 0;
            Producer(String name, Exchanger exchanger) {
                super("Producer-" + name);
                this.exchanger = exchanger;
            }
    
            @Override
            public void run() {
                for (int i=1; i<5; i++) {
                    try {
                        TimeUnit.SECONDS.sleep(1);
                        data = i;
                        System.out.println(getName()+"    :" + data);
                        data = exchanger.exchange(data);
                        System.out.println(getName()+"    :" + data);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    
        static class Consumer extends Thread {
            private Exchanger exchanger;
            private static int data = 0;
            Consumer(String name, Exchanger exchanger) {
                super("Consumer-" + name);
                this.exchanger = exchanger;
            }
    
            @Override
            public void run() {
                while (true) {
                    data = 0;
                    System.out.println(getName()+"    :" + data);
                    try {
                        TimeUnit.SECONDS.sleep(1);
                        data = exchanger.exchange(data);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(getName()+"    :" + data);
                }
            }
        }
    
        public static void main(String[] args) throws InterruptedException {
            Exchanger exchanger = new Exchanger();
            new Producer("", exchanger).start();
            new Consumer("", exchanger).start();
            TimeUnit.SECONDS.sleep(7);
            System.exit(-1);
        }
    }
    

    結果は次のようになります.
    Consumer-    :0
    Producer-    :1
    Consumer-    :1
    Consumer-    :0
    Producer-    :0
    Producer-    :2
    Producer-    :0
    Consumer-    :2
    Consumer-    :0
    Producer-    :3
    Producer-    :0
    Consumer-    :3
    Consumer-    :0
    Producer-    :4
    Producer-    :0
    Consumer-    :4
    Consumer-    :0
    

    以上のように典型的な使用シーンであり,単純に理解するとこれは同時協力のツールクラスである.
    本文はJava/Android Exchangerから必ず知っている実戦問題の分析を参考にする.