多线程之间按顺序调用,实现A->B->C,要求AA打印5次,BB打印10次,CC打印15此。循环10次。

代码:

public class ConditionDemo {
    public static void main(String[] args) {
        PrintStr printStr = new PrintStr();

        new Thread(()->{
            for (int i = 1; i <=10 ; i++) {
                printStr.print5();
            }
        },String.valueOf("t1")).start();

        new Thread(()->{
            for (int i = 1; i <=10 ; i++) {
                printStr.print10();
            }
        },String.valueOf("t2")).start();

        new Thread(()->{
            for (int i = 1; i <=10 ; i++) {
                printStr.print15();
            }
        },String.valueOf("t3")).start();
    }
}

class PrintStr{
    private int number=1;
    private Lock lock=new ReentrantLock();
    private Condition condition1=lock.newCondition();
    private Condition condition2=lock.newCondition();
    private Condition condition3=lock.newCondition();

    public void print5(){
        lock.lock();
        try{
//判断
while(number!=1){
//当前线程阻塞 condition1.await(); }
for (int i = 1; i <=5 ; i++) { System.out.println(Thread.currentThread().getName()+"\t"+i); }
//操作 number
=2;
//通知另一个线程执行 condition2.signal(); }
catch (Exception e){ e.printStackTrace(); }finally { lock.unlock(); } } public void print10(){ lock.lock(); try{ while(number!=2){ condition2.await(); } for (int i = 1; i <=10 ; i++) { System.out.println(Thread.currentThread().getName()+"\t"+i); } number=3; condition3.signal(); }catch (Exception e){ e.printStackTrace(); }finally { lock.unlock(); } } public void print15(){ lock.lock(); try{ while(number!=3){ condition3.await(); } for (int i = 1; i <=15 ; i++) { System.out.println(Thread.currentThread().getName()+"\t"+i); } number=1; condition1.signal(); }catch (Exception e){ e.printStackTrace(); }finally { lock.unlock(); } } }

结果:

 

 posted on 2020-12-10 16:42  会飞的金鱼  阅读(208)  评论(0)    收藏  举报