002 两个线程以指定步长交替打印数字与字母

本文介绍了一个多线程协作打印数字和字母的示例,通过使用Lock锁和共享变量实现线程间通信,确保线程A打印指定数量数字后,线程B能够接续打印字母。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:线程A负责打印数字,线程B负责打印字母,以指定步长n,每打印n个数字,则紧跟着打印一个字母。若字母已打印完,则紧接着仅打印数字即可,反之亦然。例如数字打印1~52,字母打印A-Z,则预期输出应为如下:

12A34B56C…4950Y5152Z

分析:本质上是利用线程的通信,来控制线程之间的交替执行。

          1、即A每打印n次,就通知B打印一次;

          2、线程B每打印一次,就通知线程A又可以打印了;

          3、不论是线程A,还是线程B,执行完毕后,都必须通知对方不必再按照原有的规则打印;

实现:线程间的通信,采用共享变量的值的变化来实现。执行块的安全性,采用Lock锁实现。

代码如下:

package com.navy.volatileDemo;

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


public class PrintNumberAndChar {
	
	private static Lock lock = new ReentrantLock();
	
	private static final int step = 2;
	
	private static int prints = 0;
	
	private static boolean isPrintNumberFinish = false;
	
	private static boolean isPrintCharFinish = false;
	
	private static class PrintNumber implements Runnable{
		private int max;
		private int min;
		
		public PrintNumber(int min, int max) {
			this.min = min;
			this.max = max;
		}
		
		@Override
		public void run() {
			while(min <= max){
				lock.lock();
				try{
					if(prints < step || isPrintCharFinish){
						System.out.print(min++);
						prints++;
					}
				}
				finally{
					lock.unlock();
				}
			}
			isPrintNumberFinish = true;
		}
	}
	
	private static class PrintChar implements Runnable{
		
		private char max;
		private char min;
		
		public PrintChar(char min, char max) {
			this.min = min;
			this.max = max;
		}
		
		@Override
		public void run() {
			while(min <= max){
				lock.lock();
				try{
					if(prints == step || isPrintNumberFinish){
						System.out.print(min++);
						prints = 0;
					}
				}
				finally{
					lock.unlock();
				}
			}
			isPrintCharFinish = true;
		}
	}
	
	public static void main(String[] args) {
		new Thread(new PrintNumber(1, 52), "printNumber").start();
		new Thread(new PrintChar('A', 'Z'), "printChar").start();
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值