多线程抢票_Java中的多线程 模拟网络抢票代码

这篇博客通过一个简单的Java代码示例展示了如何实现多线程抢票功能。首先,定义了一个`Ticket`类,包含购票数和剩余票数,并在`run()`方法中进行抢票逻辑,模拟网络延时。然后,在测试类`Test`中创建了两个线程进行抢票。未使用线程同步的情况下,会出现多个人抢到同一张票的问题。为解决此问题,引入了`synchronized`关键字进行线程同步,确保同一时刻只有一个线程能够修改票数,避免了资源竞争导致的错误。
摘要由CSDN通过智能技术生成

一、抢票类:

package cn.jbit.ticket;

public class Ticket implements Runnable {

private int num = 0; // 出票数

private int count = 10; // 剩余票数

boolean flag = false;

@Override

public void run() {

while (true) {

// 没有余票时,跳出循环

if (count <= 0) {

break;

}

num++;

count--;

try {

Thread.sleep(500);// 模拟网络延时

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("显示出票信息:" + Thread.currentThread().getName()

+ "抢到第" + num + "张票,剩余" + count + "张票");

}

}

}

二、测试类:

package cn.jbit.ticket;

public class Test {

/**

* @param args

*/

public static void main(String[] args) {

Ticket ticket=new Ticket();

//  实例化几个抢票用户

Thread mary = new Thread(ticket, "玛丽");

Thread jack = new Thread(ticket, "杰克");

mary.start();

jack.start();

}

}

不使用线程同步的代码,结果如下:多个人会抢到同一张票

使用线程同步的话,代码如下:

package cn.jbit.ticket;

public class Ticket implements Runnable {

private int num = 0; // 出票数

private int count = 10; // 剩余票数

boolean flag = false;

@Override

public void run() {

while (true) {

synchronized (this) {

// 没有余票时,跳出循环

if (count <= 0) {

break;

}

num++;

count--;

try {

Thread.sleep(500);// 模拟网络延时

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.out.println("显示出票信息:" + Thread.currentThread().getName()

+ "抢到第" + num + "张票,剩余" + count + "张票");

}

}

}

}

效果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值