多线程:使用两个线程交替打印数字和字母

这篇博客介绍了如何使用Java实现两个线程交替打印数字和字母,通过创建两个线程,共享锁对象,并使用wait()和notify()方法协调线程间的同步,最终达到1A2B3C4D的打印效果。博客详细阐述了思路和代码实现,包括线程的创建、同步机制以及关键方法的运用。
摘要由CSDN通过智能技术生成

题目

使用两个线程,一个打印数字,一个打印字母;交替打印,实现打印 1A2B3C4D;

1.思路说明:

1.1 要想实现双线程交替打印,首先得创建两个线程;使用实现runable接口方式创建两个线程;重写run方法,执行打印;
1.2 两个线程交替打印,是一种同步思想,需要让两个线程持有同一把锁(交替持有),可以利用synchronized修饰普通方法(相当于锁this对象,实现了两个线程同一把锁)
1.3 两个线程交替持有锁,持有锁的那个进行打印;没有锁的那个的等待;可以定义布尔类型变量控制实现反转
1.4 使用wait()方法,让不应该打印的线程释放自己的对象锁;让该打印的线程拿着锁去打印;
1.5 打印完毕后,用notify()唤醒等待阻塞的另一个线程。并反转布尔变量,防止当前线程再次打印;
1.6 如此交替反复,实现交替打印;

2.代码实现:

2.1创建两个线程:
public class Test {
    public static void main(String[] args) {
        //使用两个线程,一个打印数字,一个打印字母;实现打印1A2B3C4D;
        Myprint myprint=new Myprint();
        //建第一个线程,打数字,共打印4次;
       new Thread(()->{
           for (int i = 1; i <=4 ; i++) {
               myprint.printNum();
           }
       }).start();
        //建第二个线程,打字母,打印四次;
       new Thread(()->{
           for (int i = 0; i < 4; i++) {
               myprint.pringChar();
           }
       }).start();
       
    }
}
2.2创建打印类及方法
class Myprint{
    int count=0;//记录打印的轮数(也是初始数字1的前一个数字);
    char c=64;//初始字母‘A’的前一个位置;
    boolean flag=true;//用来判断该睡打印的布尔值,每个线程打印完反转,让另一个线打印;

    //打印数字的方法
    public  synchronized void printNum()  {
        if (flag==false){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.print(++count);
        flag=false;
        notify();
    }
    //打印字母的方法
    public  synchronized void pringChar() {
        if (flag==true){
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //小心char类型参与运算会转换成int参与,结果为int,需要强转成char;
        System.out.print((char)(c+count));
        flag=true;
        notify();
    }
}
2.3结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值