Java中的多線程 模擬網絡搶票代碼
阿新 • • 發佈:2017-09-27
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中的多線程 模擬網絡搶票代碼