3个人买5张票java多线程_写一个Java多线程应用程序,模拟三个人排队买票,张三、李四和王五买电影票,售票员只有三张10元的钱,电影票10元钱一张。 | 学步园...

package com.online.test;

/*编写一个Java多线程应用程序,模拟三个人排队买票,张三、李四和王五买电影票,售票员只有三张10元的钱,电影票10元钱一张。

张三拿50元一张的人民币排在李四的前面买票,李四排在王五的前面拿一张20元的人民币买票,王五拿一张10元的人民币买票。*/

public class Maipiao {

public static void main(String args[]) {

Thread zhangsan, lisi, wangwu;

sale Sale = new sale();

zhangsan = new Thread(Sale);

zhangsan.setName("z");

lisi = new Thread(Sale);

lisi.setName("l");

wangwu = new Thread(Sale);

wangwu.setName("w");

zhangsan.start();

lisi.start();

wangwu.start();

}

}

class sale implements Runnable {

int number10 = 3, number20 = 0;

public void run() {

String name = Thread.currentThread().getName();

if (name.equals("l")) { // 如果使用该方法的线程传递的参数是10,就不用等待

number10 = number10 + 1;

System.out.println("您给我10元。刚好一张票");

} else if (name.equals("w")) {

number20 = number20 + 1;

number10 = number10 - 1;

System.out.println("您给我20元。找您10元。");

} else if (name.equals("z")) {

while (number10 < 4 && number20 == 0) {

Thread.yield();

}

number10 = number10 - 2;

number20 = number20 - 1;

System.out.println("您给我50元,找您40元。两张10元。一张20元。");

}

/*

* String name = Thread.currentThread().getName(); if (name.equals("z")) {

* zhangsan.sales_princ(50); } else if (name.equals("l")) {

* Sale.sales_princ(10); } else if (name.equals("w")) {

* Sale.sales_princ(20); }

*/

}

}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是用Java编写的程序,采用Thread类实现多线程功能,模拟三个买票的场景: ```java public class TicketSeller { static int money = 0; static int tickets = 3; public static void main(String[] args) { new Thread(new ZhangSan()).start(); new Thread(new LiSi()).start(); new Thread(new ZhaoWu()).start(); } static class ZhangSan implements Runnable { @Override public void run() { synchronized (TicketSeller.class) { while (true) { if (money >= 5 && tickets > 0) { money += 5; tickets--; System.out.println("张三到了一张电影票,剩余票数为" + tickets + "张,售票员手中有" + money + ""); } else if (money < 5) { money += 20; System.out.println("张三排在了李四前面,买票不够,给售票员一张20的人民币"); } else if (tickets <= 0) { System.out.println("张三发现电影票已经完,离开了票处"); break; } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } } static class LiSi implements Runnable { @Override public void run() { synchronized (TicketSeller.class) { while (true) { if (money >= 5 && tickets > 0) { money += 5; tickets--; System.out.println("李四到了一张电影票,剩余票数为" + tickets + "张,售票员手中有" + money + ""); } else if (money < 5) { money += 10; System.out.println("李四排在了赵五前面,买票不够,给售票员一张10的人民币"); } else if (tickets <= 0) { System.out.println("李四发现电影票已经完,离开了票处"); break; } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } } static class ZhaoWu implements Runnable { @Override public void run() { synchronized (TicketSeller.class) { while (true) { if (money >= 5 && tickets > 0) { money += 5; tickets--; System.out.println("赵五到了一张电影票,剩余票数为" + tickets + "张,售票员手中有" + money + ""); } else if (tickets <= 0) { System.out.println("赵五发现电影票已经完,离开了票处"); break; } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } } } ``` 在程序中,我们定义了一个售票员类TicketSeller,其中有一个共享变量money表示售票员手中拥有的人民币金额,另一个共享变量tickets表示售票员手中拥有的电影票张数。然后我们创建三个线程分别模拟张三李四和赵五的购票过程。 在每个线程的run()方法中,我们使用synchronized关键字锁住了TicketSeller.class,确保了多个线程同时访问售票员时的线程安全。在循环中,我们分别处理了三个人的购票流程。如果手中的足够买票,就减去5的票价和加上5的人民币;如果不够,就给售票员一张大面额的钞票,等着找零;如果票已经完,就离开票处。 以上程序可以模拟三个买票的场景,确保了线程安全,并且可以正确处理找零的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值