博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA多线程(9):多线程依次打印ABC
阅读量:4280 次
发布时间:2019-05-27

本文共 2905 字,大约阅读时间需要 9 分钟。

一、需求描述

编写一个程序,开启3个线程,这三个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印20遍,要求输出的结果必须按顺序显示。如:ABCABCABC….依次递归

二、实现代码

package thread.thread;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class AlterThread {    public static void main(String[] args) {        alterABC alter=new alterABC();        new Thread(new Runnable() {            @Override            public void run() {                for (int i = 0; i < 20; i++) {                    alter.getA(i);                }            }        },"A").start();        new Thread(new Runnable() {            @Override            public void run() {                for (int i = 0; i < 20; i++) {                    alter.getB(i);                }            }        },"B").start();        new Thread(new Runnable() {            @Override            public void run() {                for (int i = 0; i < 20; i++) {                    alter.getC(i);                }            }        },"C").start();    }}class alterABC{    int num=1;    //显示锁    Lock lock=new ReentrantLock();    //线程通信    Condition condition1=lock.newCondition();    Condition condition2=lock.newCondition();    Condition condition3=lock.newCondition();    /**     * 线程A打印     * @param totalnum     */    public void getA(int totalnum)  {        lock.lock();        try {            //1.判断,如果不是1,就等待            if(num!=1){                condition1.await();            }            //2.打印            for (int i = 0; i <= 5; i++) {                System.out.println(Thread.currentThread().getName()+"\t"+i+ "\t"+totalnum);            }            //3.通知对应线程            num=2;            condition2.signal();        } catch (InterruptedException e) {            e.printStackTrace();        } finally {            lock.unlock();        }    }    public void getB(int totalnum)  {        lock.lock();        try {            //1.判断,如果不是1,就等待            if(num!=2){                condition2.await();            }            //2.打印            for (int i = 0; i <= 5; i++) {                System.out.println(Thread.currentThread().getName()+"\t"+i+ "\t"+totalnum);            }            //3.通知对应线程            num=3;            condition3.signal();        } catch (InterruptedException e) {            e.printStackTrace();        } finally {            lock.unlock();        }    }    public void getC(int totalnum)  {        lock.lock();        try {            //1.判断,如果不是1,就等待            if(num!=3){                condition3.await();            }            //2.打印            for (int i = 0; i <= 5; i++) {                System.out.println(Thread.currentThread().getName()+"\t"+i+ "\t"+totalnum);            }            //3.通知对应线程            num=1;            condition1.signal();        } catch (InterruptedException e) {            e.printStackTrace();        } finally {            lock.unlock();        }    }}

 

转载地址:http://hjygi.baihongyu.com/

你可能感兴趣的文章
c/c++常见关键字
查看>>
C++内存地址分配和内存区划分简介
查看>>
C++数值交换
查看>>
指针数组、数组指针、函数指针、指针函数
查看>>
float,double在内存中的存储方式
查看>>
int main(int argc,char* argv[])详解
查看>>
C++打印地址
查看>>
ARM处理器比较:A8/A9
查看>>
ARM处理器工作模式
查看>>
ARM处理器寄存器
查看>>
汇编语言学习
查看>>
ARM寻址方式
查看>>
ARM伪指令
查看>>
协处理器
查看>>
ARM处理器启动流程
查看>>
链接地址和存储地址
查看>>
uboot工作流程分析
查看>>
c语言与c++区别
查看>>
设置SVC模式
查看>>
关闭看门狗
查看>>