线程固定顺序交替输出的三种方式(趁室友不在寒假在家偷偷学)

目录

 synchronized方式

(ReentrantLock)await & signal方式

(LockSupport)park&unpark方式


 synchronized方式

package com.atguigu.juc;

public class ChangePrint {
    public static void main(String[] args) {
        WaitChange waitChange = new WaitChange(1, 5);
        new Thread(()->{
            waitChange.print("a",1,2);
        }).start();
        new Thread(()->{
            waitChange.print("b",2,3);
        }).start();
        new Thread(()->{
            waitChange.print("c",3,1);
        }).start();
    }
}
class WaitChange {

    private int flag;

    private int loopNumber;

    public WaitChange(int flag, int loopNumber) {
        this.flag = flag;
        this.loopNumber = loopNumber;
    }
    public void print(String str,int waitFlag,int nextFlag){
        for (int i = 0; i < loopNumber; i++) {
            synchronized (this){
                while(flag != waitFlag){
                    try {
                        this.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.print(str+" ");
                flag = nextFlag;
                this.notifyAll();
            }
        }
    }
}

(ReentrantLock)await & signal方式

package com.atguigu.juc;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.LockSupport;

public class ChangePrintLockSupport {
    static Thread t1;
    static Thread t2;
    static Thread t3;
    public static void main(String[] args) {
        ParkUnpark parkUnpark = new ParkUnpark(5);

         t1 = new Thread(()->{
            parkUnpark.print("a",t2);
        });
         t2 = new Thread(()->{
            parkUnpark.print("b",t3);
        });
         t3 = new Thread(()->{
            parkUnpark.print("c",t1);
        });

        t1.start();
        t2.start();
        t3.start();

        LockSupport.unpark(t1);
    }
}

class ParkUnpark {

    private int loopNumber;

    public ParkUnpark(int loopNumber) {
        this.loopNumber = loopNumber;
    }
    public void print(String cur,Thread next){
        for (int i = 0; i < loopNumber; i++) {
            LockSupport.park();
            System.out.println(cur);
            LockSupport.unpark(next);
        }
    }
}

(LockSupport)park&unpark方式

package com.atguigu.juc;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class ChangePrintReentrantLock {
    public static void main(String[] args) throws InterruptedException {
        ChangeReentrantLock reentrantLock = new ChangeReentrantLock(5);
        Condition c1 = reentrantLock.newCondition();
        Condition c2 = reentrantLock.newCondition();
        Condition c3 = reentrantLock.newCondition();
        new Thread(()->{
            reentrantLock.print("a",c1,c2);
        }).start();

        new Thread(()->{
            reentrantLock.print("b",c2,c3);
        }).start();

        new Thread(()->{
            reentrantLock.print("c",c3,c1);
        }).start();

        Thread.sleep(1000);

        reentrantLock.lock();
        try {
            System.out.println("开始");
            c1.signal();
        } finally {
            reentrantLock.unlock();
        }
    }
}


class ChangeReentrantLock extends ReentrantLock {

    private int loopNumber;

    public ChangeReentrantLock(int loopNumber) {
        this.loopNumber = loopNumber;
    }

    public void print(String str, Condition curCondition,Condition nextCondition){

        for (int i = 0; i < loopNumber; i++) {
            lock();
            try {
                try {
                    curCondition.await();
                    System.out.println(str);
                    nextCondition.signal();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            } finally {
                unlock();
            }
        }


    }

}

猜你喜欢

转载自blog.csdn.net/m0_60264772/article/details/122501668