首页 > 编程语言 > 详细

三个线程交替打印ABC

时间:2021-07-06 23:13:25      阅读:37      评论:0      收藏:0      [点我收藏+]

第一种方式:使用wait/notify实现

public class PrintABC1 {
    int state;//状态量,指示线程交替
    int times;//每个线程打印次数
    private static final Object lock=new Object();

    public void printABC1(int times){
        this.times=times;
    }

    public void print(String str,int target){
        for(int i=0;i<times;i++){
            synchronized (PrintABC1.class){
                if (state % 3 == target){
                    state++;
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                notifyAll();
            }
        }
    }

    public static void main(String[] args){
        printABC printABC=new printABC(3);
        Thread t1=new Thread(()->{
            printABC.print("A",0);
        });
        Thread t2=new Thread(()->{
            printABC.print("B",1);
        });
        Thread t3=new Thread(()->{
            printABC.print("C",2);
        });
        t1.start();
        t2.start();
        t3.start();

    }
}

 

第二种方式:使用ReentrantLock实现

 

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

public class printABC {
    private int times;
    private int state;
    Lock lock=new ReentrantLock();

    public printABC(int times){
        this.times=times;
    }

    public void print(String str,int target){
        for(int i=0;i<times;){
            if (state % 3 == target){
                lock.lock();
                System.out.println(str);
                state++;
                i++;//重点,i++如果写在for循环中就会导致当if条件不满足时直接进入下一次循环,无法实现交替功能
                    //写在被锁住的代码块之间使得只有在满足if条件时,才有i++
                lock.unlock();
            }
        }
    }

    public static void main(String[] args){
        printABC printABC=new printABC(3);
        Thread t1=new Thread(()->{
            printABC.print("A",0);
        });
        Thread t2=new Thread(()->{
            printABC.print("B",1);
        });
        Thread t3=new Thread(()->{
            printABC.print("C",2);
        });
        t1.start();
        t2.start();
        t3.start();

    }

}

 

三个线程交替打印ABC

原文:https://www.cnblogs.com/lcy6/p/14978902.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!