一道经典的线程间通信的编程题

本来是看到另一篇博文中的题目,觉得博主实现的方式有点问题,故尝试自己实现,还望大家指教。

http://blog.csdn.net/u014039577/article/details/48623721

 

问题描述

启动3个线程打印递增的数字, 线程1先打印1,2,3,4,5, 然后是线程2打印6,7,8,9,10, 然后是线程3打印11,12,13,14,15. 接着再由线程1打印16,17,18,19,20....以此类推, 直到打印到75. 程序的输出结果应该为:

线程1: 1

线程1: 2

线程1: 3

线程1: 4

线程1: 5

线程2: 6

线程2: 7

线程2: 8

线程2: 9

线程2: 10

...

线程3: 71

线程3: 72

线程3: 73

线程3: 74

线程3: 75

 

实现代码:

public class WaitNotifyDemo1 {
	private int num; //输出数字
	private int runThreadNum; //当前运行线程编号
	
	public WaitNotifyDemo1(int num, int runThreadNum){
		this.num = num;
		this.runThreadNum = runThreadNum;
	}
	
	
	/**
	 * 打印线程
	 */
	static class PrintThread extends Thread{
		private int threadNum; //当前运行线程编号
		private WaitNotifyDemo1 demo; //锁对象
		
		public PrintThread(int threadNum, WaitNotifyDemo1 demo){
			this.threadNum = threadNum;
			this.demo = demo;
		}
		
		@Override
		public void run() {
			synchronized (demo) {
				try{
					for(int i=1; i<=5; i++){
						while(true){
							if(threadNum == demo.runThreadNum){
								break;
							}
							else{
								//如果当前线程不是接下来要运行的线程,进入等待池
								demo.wait(); 
							}
						}
						
						for(int j=1; j<=5; j++){
							System.out.println("线程"+threadNum+":"+(++demo.num));
						}
						
						demo.runThreadNum = demo.runThreadNum%3 +1; //计算之后运行的线程编号
						demo.notifyAll(); //唤醒所有等待池中的线程
					}
				}
				catch(Exception e){
					e.printStackTrace();
				}
			}
		}
	}
	
	
	public static void main(String[] args) {
		WaitNotifyDemo1 demo = new WaitNotifyDemo1(0,1);
		
		new PrintThread(1,demo).start();
		new PrintThread(2,demo).start();
		new PrintThread(3,demo).start();
	}
}
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REaDME.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值