Java两个线程轮换打印1-100内的奇数和偶数

本文介绍了一个使用两个线程交替打印1-100范围内奇数和偶数的Java示例。通过状态变量和同步机制确保了线程间的正确协作与交替执行。

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

问题:

  两个线程,一个打印1-100的奇数,一个打印1-100的偶数;要求:线程1打印5个之后,线程2开始打印,线程2打印5个之后,线程1再开始打印,以此循环。


 

public class Test {
	//state==1表示线程1开始打印,state==2表示线程2开始打印
	private static int state = 1;
	
	private static int num1 = 1;
	private static int num2 = 2;
	
	public static void main(String[] args) {
		final Test t = new Test();
		new Thread(new Runnable() {
			@Override
			public void run() {
				while(num1<100){
					//两个线程都用t对象作为锁,保证每个交替期间只有一个线程在打印
					synchronized (t) {
						// 如果state!=1, 说明此时尚未轮到线程1打印, 线程1将调用t的wait()方法, 直到下次被唤醒
						if(state!=1){
							try {
								t.wait();
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
						}
						 // 当state=1时, 轮到线程1打印5次数字
						for(int j=0; j<5; j++){
							System.out.println(num1);
							num1 += 2;
						}
						// 线程1打印完成后, 将state赋值为2, 表示接下来将轮到线程2打印
						state = 2;
						// notifyAll()方法唤醒在t上wait的线程2, 同时线程1将退出同步代码块, 释放t锁
						t.notifyAll();
					}
				}
			}
		}).start();
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				while(num2<100){
					synchronized (t) {
						if(state!=2){
							try {
								t.wait();
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
						}
						for(int j=0; j<5; j++){
							System.out.println(num2);
							num2 += 2;
						}
						state = 1;
						t.notifyAll();
					}
				}
			}
		}).start();
	}

}

某公司想要设计一款自动化排班系统有如下需求: 1.该系统能够管理员工在位情况,有公司领导,技工(一级技工二级技工其中二级大于一级),普工(有级别从一级到五级),实习生(实习三月结束后转为正式员工)四中种角色,其中所有员工有在位,请假(并显示请假天数起始时间) ,出差(并显示请假天数起始时间),病假,以及员工的个人基本信息。 2.白班排班系统,该公司有n个小组,每个小组有m个小组成员两个技工。排班从第一个个小组到最后一个小组依次轮动人员进行上班,除了技工可以不用上班(标记了请假,病假,出差等特殊状态的员工不进行排班,直到状态变为在位时进入排班)。注:白班时间为早上8点到下午6点,白班每一班需要人数为m人 3.夜班系统,其中技工,普工,实习生均参与夜班轮班。实习生在实习期间不得一人上工位必须有一个员工陪同。注:夜班时间为晚上8点到次日凌晨6点。夜班的每一班需n人 4.公司领导虽然不纳入白班夜班排班,但每周轮一次进行车间管理。此外默认情况下上述排班表是在本公司使用。但是由于公司加单,扩展了A,B两个在车间,但是A车间只用于夜班加班因此需要从总公司分一部分人到A公司上夜班(夜班轮班计划人数总公司一致)。B公司则需要上夜班白班(排班计划也总公司一致)。A,B两个车间的排班人数计划是由总公司订单计划而变,分下面几种情况,A,B两个子车间无需使用;只使用A子公司;只使用B公司。A,B公司以及总公司都同时使用。A,B公司的使用权由管理严决定。 5.管理员能对人员信息进行修改,游客模式下只能对所有信息有读操作。 6.上述时间能日历时间统一,最后能有一键导出单日排班表的功能(Excel表格)。 7.使用Python语音,pyqt框架,MySQL请结合上述需求给出合理的序设计流图,算法等
最新发布
06-18
package com.ljl.org.test4; /** *@DEMO:Interview *@Author:jilongliang *@Date:2013-4-17 * * 分别使用Runnable接口Thread类编实 编写一应用创建两个线程一个线程打印输出11000之间所有的奇数(Odd Number) * 另外一个线程打印输出1-1000之间所有的偶数(Even Number)要求两个线程随机休眠一 段时间后 继续打印输出下一个数 * * 创建线程有两种方式: 1.实现Runnable接口 2.继承Thread类 * 实现方式继承方式有啥区别? * 实现方式的好处:避免了单继承的局限性 在定义线程时. * 建议使用实现方式 * 区别: * 继承Thread:线程代码存放Thread子类run方法中 实现 * Runnable:线程代码存放接口的子类的run方法 * wait释放资源,释放锁 * sleep释放资源,不释放锁 */ @SuppressWarnings("all") public class Thread1 { public static void main(String[] args) { //方法一 /* OddNumber js = new OddNumber(); js.start(); EvenNumber os = new EvenNumber(); os.start(); while (true) { if (js.i1 == 1000 || os.i2 == 1000) { System.exit(-1); } } */ //方法二 OddNum on=new OddNum(); EvenNum en=new EvenNum(); new Thread(on).start(); new Thread(en).start(); while (true) { if (on.i1 == 1000 || en.i2 == 1000) { System.exit(-1); } } } } /** * ============================继承Thread的线程=============================== */ class EvenNumber extends Thread { int i2; @Override public void run() { for (i2 = 1; i2 <= 1000; i2++) { if (i2 % 2 == 0) { System.out.println("偶數" + i2); } try { sleep((int) (Math.random() * 500) + 500); } catch (Exception e) { } } } } class OddNumber extends Thread { int i1; @Override public void run() { for (i1 = 1; i1 <= 1000; i1++) { if (i1 % 2 != 0) { System.out.println("奇數" + i1); } try { sleep((int) (Math.random() * 500) + 500); } catch (Exception e) { } } } } /** * ============================实现Runnable的线程=============================== */ @SuppressWarnings("all") class OddNum implements Runnable { int i1; @Override public void run() { for (i1 = 1; i1 <= 1000; i1++) { if (i1 % 2 != 0) { System.out.println("奇數" + i1); } try { new Thread().sleep((int) (Math.random() * 500)+500); } catch (Exception e) { } } } } @SuppressWarnings("all") class EvenNum implements Runnable { int i2; @Override public void run() { for (i2 = 1; i2 <= 1000; i2++) { if (i2 % 2 == 0) { System.out.println("偶數" + i2); } try { /**在指定的毫秒数内让当前正在执行的线程休眠 * Math.random()一个小于1的随机数乘于500+500,随眠时间不会超过1000毫秒 */ //new Thread().sleep((int) (Math.random() * 500)+500); new Thread().sleep(1000);//也可以指定特定的参数毫秒 } catch (Exception e) { } } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值