线程-线程接力-多线程编程



本次使用的编译工具是idea

package lt.test01;

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

/**
 * 多线程之间按照顺序的调用、实现a-b-c、三个线程启动要求
 * aa打印5次、bb打印10次、cc打印15次
 * aa打印5次、bb打印10次、cc打印15次
 * 共计来5轮
 */
public class ThreadRelay {
    private int number = 1;
    private Lock lock = new ReentrantLock();
    Condition con = lock.newCondition();
    Condition con1 = lock.newCondition();
    Condition con2 = lock.newCondition();
    public  void  loapAA(int loop){
    lock.lock();
    try{
        //判断
        while(number !=1){
            con.await();
        }
        //干活
        for (int i = 1; i <= 5; i++) {
            System.out.print(Thread.currentThread().getName()+"\t"+i+"\t当前是第:"+loop+"轮\n");
        }
        //线程的唤醒+改标记
        number = 2;
        con1.signal();
    }catch(Exception e){
        e.printStackTrace();
        }finally {
        lock.unlock();
    }

    }

    public  void  loapBB(int loop){
        lock.lock();
        try{
            //判断
            while(number !=2){
                con1.await();
            }
            //干活
            for (int i = 1; i <= 10; i++) {
                System.out.print(Thread.currentThread().getName()+"\t"+i+"\t当前是第:"+loop+"轮\n");
            }
            number = 3;
            con2.signal();
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }

    }

    public  void  loapCC(int loop){
        lock.lock();
        try{
            //判断
            while(number !=3){
                con2.await();
            }
            //干活
            for (int i = 1; i <= 15; i++) {
                System.out.print(Thread.currentThread().getName()+"\t"+i+"\t当前是第:"+loop+"轮 \n");
            }
            number =1 ;
            con.signal();
        }catch(Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }

    }
    public static void main(String[] args){
    final  ThreadRelay t = new ThreadRelay();
        new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 1; i <= 5; i++) {
                t.loapAA(i);
            }
        }
    },"AA").start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    t.loapBB(i);
                }
            }
        },"BB").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    t.loapCC(i);
                }
            }
        },"CC").start();

     
}
}


猜你喜欢

转载自blog.csdn.net/qq_40408317/article/details/80095621
今日推荐