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

一、抢票类:

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 + "张票");
			}
		}
	}

	 

}

  效果如下:

原文地址:https://www.cnblogs.com/xiaobudong/p/7599470.html