java多線程 更優雅的實現線程同步:交替打印A、B LockSupport實現


一 問題概述

線程或者進程之間有兩種關系 同步和互斥,我們通常實現同步方法是使用線程的等待喚醒機制,而等待喚醒機制的使用是建立在互斥的繼承上的。但是同步線程並不一定是必須要實現互斥的。比如一個線程打印A,一個線程打印B。這兩個線程就沒有互斥關系,但是提出這么個需求:交替打印A、B 。我們一般的解決方案,往往要使用wait()/notify機制。

 

 

二 LockSupport 介紹

LockSupport作為一個工具類,主要學習它的方法。

park():在線程內調用,表示當前線程自我阻塞,直到獲得許可證

park(線程變量):讓指定的線程獲得許可證。

一看這兩個方法的定義,顯然可以利用這兩個方法實現線程的順序調用(同步)

 

三 兩種思路實現交替打印A/B

等待喚醒機制:

/**
 * @program: test
 * @description: 交替打印A/B 等待喚醒機制
 * @author:
 * @create: 2019-07-22 14:28
 */
public class Test3 {
   static  class MyRun implements Runnable {
        static int i = 0;
        @Override
        public synchronized  void run() {
            for (int j = 0; j < 10; j++) {
                if(i%2==0)
                    System.out.println(Thread.currentThread().getName()+":A");
                else
                    System.out.println(Thread.currentThread().getName()+":B");
                i++;
                this.notifyAll();
                try {
                    if(i>=19)
                        Thread.sleep(10);
                    else
                        this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        MyRun myRun = new MyRun();
        Thread a = new Thread(myRun);
        Thread b = new Thread(myRun);
        a.start();
        b.start();
    }
}

  

LockSupport 實現

/**
 * @program: test
 * @description:交替打印A,B LockSupport實現
 * @author:
 * @create: 2019-07-22 14:03
 */
public class Test2 {
     static Thread a=null;
    static  Thread b=null;
    public static void main(String[] args) {
        a= new Thread(new Runnable() {
            @Override
            public void run() {

                for (int i = 0; i < 10; i++) {
                    LockSupport.park();
                    System.out.println(Thread.currentThread().getName()+":B");
                    LockSupport.unpark(b);
                }
            }
        });
       b=new Thread((new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println(Thread.currentThread().getName()+":A");
                    LockSupport.unpark(a);
                    LockSupport.park();
                }
            }
        }));
        a.start();
        b.start();

    }
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM