java之多線程搶火車票的實(shí)現(xiàn)示例
一、創(chuàng)建線程的方法是實(shí)現(xiàn)runnable,重寫run方法,執(zhí)行線程需要丟入runnable接口實(shí)現(xiàn)類,調(diào)用start方法
*********************************/ //多個(gè)線程同時(shí)操作一個(gè)類 //火車票 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)問題:多個(gè)線程操作同一個(gè)資源的情況下,線程不安全,數(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) + "個(gè)人搶到第" + (++ticketNum) + " 張票"); try { Thread.sleep(100); }catch (Exception e){ e.printStackTrace(); } }else { System.out.println(Thread.currentThread().getName() + "第" + (++peopleNum) + " 個(gè)人未搶到票"); } } } } } }
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之多線程搶火車票的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)java 多線程搶火車票內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)多線程斷點(diǎn)下載實(shí)例代碼(下載過程中可以暫停)
線程可以理解為下載的通道,一個(gè)線程就是一個(gè)文件的下載通道,多線程也就是同時(shí)開啟好幾個(gè)下載通道,Java實(shí)現(xiàn)多線程斷點(diǎn)下載實(shí)例代碼(下載過程中可以暫停),有興趣的可以了解一下。2016-12-12Java中數(shù)組復(fù)制的三種方式小結(jié)
在Java中,數(shù)組復(fù)制是一種常見的操作,它允許開發(fā)人員在不修改原始數(shù)組的情況下創(chuàng)建一個(gè)新的數(shù)組,本文就來介紹三種方法,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02Java觀察者模式之實(shí)現(xiàn)對(duì)象間的一對(duì)多依賴
這篇文章主要介紹了Java觀察者模式之實(shí)現(xiàn)對(duì)象間的一對(duì)多依賴的方法,Java觀察者模式是一種行為型設(shè)計(jì)模式,用于實(shí)現(xiàn)對(duì)象之間的消息傳遞和通信,文中有詳細(xì)的實(shí)現(xiàn)步驟和代碼示例,,需要的朋友可以參考下2023-05-05java中ConcurrentHashMap的讀操作為什么不需要加鎖
ConcurrentHashMap完全允許多個(gè)讀操作并發(fā)進(jìn)行,讀操作并不需要加鎖。所以下面這篇文章主要給大家介紹了關(guān)于java中ConcurrentHashMap的讀操作為什么不需要加鎖的相關(guān)資料,需要的朋友可以參考下2018-10-10Java模擬實(shí)現(xiàn)斗地主的洗牌和發(fā)牌
這篇文章主要為大家詳細(xì)介紹了Java模擬實(shí)現(xiàn)斗地主的洗牌和發(fā)牌,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04