java之多線程搶火車票的實現(xiàn)示例
一、創(chuàng)建線程的方法是實現(xiàn)runnable,重寫run方法,執(zhí)行線程需要丟入runnable接口實現(xiàn)類,調(diào)用start方法
*********************************/ //多個線程同時操作一個類 //火車票 public class TestTread4 implements Runnable{ //票數(shù) private int ticketNums = 10; @Override public void run() { while (true) { if (ticketNums <= 0) { break; } try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"--->拿到了第"+ticketNums-- +"張票"); } } public static void main(String[] args) { TestTread4 testTread4 = new TestTread4(); new Thread(testTread4, "小明").start(); new Thread(testTread4,"老師").start(); new Thread(testTread4,"黃牛").start(); } }
發(fā)現(xiàn)問題:多個線程操作同一個資源的情況下,線程不安全,數(shù)據(jù)紊亂.
加上鎖就搞定
public class TestTread4 implements Runnable{ //票數(shù) private int ticketNums = 10; @Override public synchronized void run() { while (true) { if (ticketNums <= 0) { break; } try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"--->拿到了第"+ticketNums-- +"張票"); } } public static void main(String[] args) { TestTread4 testTread4 = new TestTread4(); new Thread(testTread4, "小明").start(); new Thread(testTread4,"老師").start(); new Thread(testTread4,"黃牛").start(); } }
當(dāng)有200人搶100張票
public class TicketRunnable implements Runnable { /** * 總票數(shù) */ private final int ticketSize = 100; /** * 搶票人數(shù) */ private final int peopleSize = 200; /** * 票數(shù) */ private int ticketNum; /** * 人數(shù) */ private int peopleNum; @Override public void run() { while(ticketNum < ticketSize && peopleNum < peopleSize){ synchronized (this){ if(ticketNum < ticketSize && peopleNum < peopleSize){ if((int)(Math.random() * 20) % 2 == 1){ System.out.println(Thread.currentThread().getName() + "第" + (++peopleNum) + "個人搶到第" + (++ticketNum) + " 張票"); try { Thread.sleep(100); }catch (Exception e){ e.printStackTrace(); } }else { System.out.println(Thread.currentThread().getName() + "第" + (++peopleNum) + " 個人未搶到票"); } } } } } }
public class TestTicket { public static void main(String[] args) { TicketRunnable tr = new TicketRunnable(); Thread t1 = new Thread(tr , "窗口A"); Thread t2 = new Thread(tr , "窗口B"); Thread t3 = new Thread(tr , "窗口C"); Thread t4 = new Thread(tr , "窗口D"); t1.start(); t2.start(); t3.start(); t4.start(); } }
到此這篇關(guān)于java之多線程搶火車票的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)java 多線程搶火車票內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)多線程斷點下載實例代碼(下載過程中可以暫停)
線程可以理解為下載的通道,一個線程就是一個文件的下載通道,多線程也就是同時開啟好幾個下載通道,Java實現(xiàn)多線程斷點下載實例代碼(下載過程中可以暫停),有興趣的可以了解一下。2016-12-12Java中數(shù)組復(fù)制的三種方式小結(jié)
在Java中,數(shù)組復(fù)制是一種常見的操作,它允許開發(fā)人員在不修改原始數(shù)組的情況下創(chuàng)建一個新的數(shù)組,本文就來介紹三種方法,具有一定的參考價值,感興趣的可以了解一下2024-02-02java中ConcurrentHashMap的讀操作為什么不需要加鎖
ConcurrentHashMap完全允許多個讀操作并發(fā)進(jìn)行,讀操作并不需要加鎖。所以下面這篇文章主要給大家介紹了關(guān)于java中ConcurrentHashMap的讀操作為什么不需要加鎖的相關(guān)資料,需要的朋友可以參考下2018-10-10