Java同時プログラミング3スレッド間通信

5669 ワード

Java同時プログラミング3スレッド間通信
スレッド間通信:複数のスレッドが同じリソースを処理し、タスクが異なる場合、スレッド間の同じ変数の使用または操作を解決するためにスレッド通信が必要です.複数のスレッドが同じデータを操作する際に、同じ共有変数の争いを避けることです.
1.wait/notify
wait/notifyメソッドによるスレッド間通信(wait/notifyはObjectメソッド)
  • waitとnotifyはsynchronizedキーワードと合わせて
  • を使用する必要があります.
  • waitリリースロック、notifyリリースロック
  • /**
     * wait/notify   
     * Created by lyyz on 18-5-9.
     */
    public class SyncTest {
        private volatile List list = new ArrayList();
    
        public void add(){
            list.add("aaaa");
        }
        public int getSize(){
            return list.size();
        }
    
        public static void main(String[] args) {
            //lock  
            //wait/notify    synchronized     
            final Object lock = new Object();
            final SyncTest syncTest = new SyncTest();
            Thread t1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    synchronized (lock){
                        try {
                            for (int i=0;i<10;i++){
                                syncTest.add();
                                System.out.println(syncTest.getSize());
                                Thread.sleep(500);
                                if (syncTest.getSize()==5){
                                    System.out.println("t1 notify t2");
                                    //notify                ,             ,  lock 
                                    lock.notify();
                                }
                            }
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
    
                }
            },"t1");
    
            Thread t2 = new Thread(new Runnable() {
                @Override
                public void run() {
                    synchronized (lock){
                        if(syncTest.getSize()!=5){
                            try {
                                //wait           ,                      ,                      
                                lock.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        System.out.println("t2 run");
                    }
    
    
                }
            },"t2");
    
            t2.start();
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            t1.start();
        }
    }

    2.ThreadLocal
    ThreadLocalは一般的にスレッドローカル変数と呼ばれ、変数をスレッドにバインドし、スレッドごとに独立した変数のコピーを維持する特殊なスレッドバインドメカニズムです.ThreadLocalを使用すると、オブジェクトの表示範囲を同じスレッドに制限できます.ThreadLoalはソースコードを見ることで、実際には各スレッドの変数を1つのMapに格納していることがわかります.
     public void set(T value) {
        Thread t = Thread.currentThread();//1.          
            ThreadLocalMap map = getMap(t);//2.        ThreadLocalMap
            if (map != null)
                map.set(this, value);//  map   ,  set  ,   threadLocal   key,       value  set  
            else
                createMap(t, value);//  map  ,       ThreadLocalMap
        }