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

	 

}

  效果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM