Java多线程--三个线程分别打印a,b,c.请用多线程实现循环打印15次abc

扫盲:
想想自己多线程解决生产消费者问题就知道个synchronized,真是惭愧
为做此题目特意学习新的多线程知识–ReentrantLock跟synchronized一样都是Java中的可重入锁(可以在内部锁中拿到外部锁)
Condition是条件的意思,Condition.await()让线程进入等待,Condition.signal()唤醒线程

package cn.itchg;

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

/**
 * Created by CHG on 2017-02-23 20:20.
 */
public class PrintABC {
    int count = 0; //打印次数
    Lock lock = new ReentrantLock();  //可重写锁
    Condition conditionA = this.lock.newCondition();
    Condition conditionB = this.lock.newCondition();
    Condition conditionC = this.lock.newCondition();

    public class PrintA implements Runnable {
        @Override
        public void run() {
            while (true)
                if (count < 15) {
                    lock.lock();
                    System.out.print("A");
                    try {
                        conditionB.signal();  //线程b唤醒,因为a打印完应该打印b
                        conditionA.await();  //线程a进入等待队列
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        lock.unlock();
                    }

                }
        }
    }

    public class PrintB implements Runnable {
        @Override
        public void run() {
            while (true)
                if (count < 15) {
                    lock.lock();
                    System.out.print("B");
                    try {
                        conditionC.signal();
                        conditionB.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        lock.unlock();
                    }

                }
        }
    }

    public class PrintC implements Runnable {
        @Override
        public void run() {
            while (true)
                if (count < 15) {
                    lock.lock();
                    System.out.println("C" + count);
                    count++;//打印完c后,count++
                    try {
                        conditionA.signal();
                        conditionC.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } finally {
                        lock.unlock();
                    }

                }
        }
    }

    public static void main(String[] args) {
        PrintABC printABCD = new PrintABC();
        new Thread(printABCD.new PrintA()).start();
        new Thread(printABCD.new PrintB()).start();
        new Thread(printABCD.new PrintC()).start();

    }

}

执行结果:

ABC0
ABC1
ABC2
ABC3
ABC4
ABC5
ABC6
ABC7
ABC8
ABC9
ABC10
ABC11
ABC12
ABC13
ABC14

Process finished with exit code 1

你可能感兴趣的:(java)