多线程案例

本文通过模拟三人排队购买电影票的场景,探讨了线程同步和资源竞争的问题。zhang、li、zhao分别持有不同金额进行购票,而售票员初始只有3张5元零钱。使用Java的Thread和synchronized关键字实现线程间的同步,确保在资源有限的情况下,每个线程能够正确地完成购票流程。

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

题目:模拟3人排队买电影票,zhang,li,zhao依次排队购票,zhang有20元、li有10元、zhao有5元,售票员有3张5元。

主类:

package TEST1;

public class Moive {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Counter counter=new Counter();
		Thread zhang=new Thread(counter);
		Thread li=new Thread(counter);
		Thread zhao=new Thread(counter);
		zhang.setName("zhang");
		li.setName("li");
		zhao.setName("zhao");
		zhang.start();
		li.start();
		zhao.start();
	}
}

Counter类:

package TEST1;

public class Counter implements Runnable{
	int fiveAmount=3,tenAmount=0,twentyAmount=0;
	int change=fiveAmount*5+tenAmount*10;
	public void run() {
		if(Thread.currentThread().getName().equals("zhang")) {
			setTicket(20);
		}
		if(Thread.currentThread().getName().equals("li")) {
			setTicket(10);
		}
		if(Thread.currentThread().getName().equals("zhao")) {
			setTicket(5);
		}
	}
	private synchronized void setTicket(int money) {
		if(money==20) {
			while(!(fiveAmount>=1&&change>=15)) {
				try {
					System.out.println("not enough change to zhang");
					wait();
					System.out.println("zhang continue buy ticket");
					}	
				catch(InterruptedException e) { }
				}
				twentyAmount=1;
				fiveAmount=fiveAmount-3;
				System.out.println("zhang get a ticket");
			}
		
		else if (money==10) {
			while(fiveAmount==0) {
				try {
					System.out.println("not enough change to li");
					wait();
					System.out.println("li continue buy ticket");
					}	
				catch(InterruptedException e) { }
				}
			fiveAmount=fiveAmount-1;
			tenAmount=tenAmount+1;
			change=fiveAmount*5+tenAmount*10;
			System.out.println("li get a ticket");
			}
		
			
		else if(money==5){
			fiveAmount=fiveAmount+1;
			System.out.println("zhao get a ticket");
			change=fiveAmount*5+tenAmount*10;
		}
		notifyAll();
	}
}

其中几次结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值