1. 程式人生 > >Java中的多線程 模擬網絡搶票代碼

Java中的多線程 模擬網絡搶票代碼

over pub lag catch println div trace stack static

一、搶票類:

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

	 

}

  效果如下:

技術分享

Java中的多線程 模擬網絡搶票代碼