java多線(xiàn)程模擬實(shí)現(xiàn)售票功能
鐵道部發(fā)布了一個(gè)售票任務(wù),要求銷(xiāo)售1000張票,要求有3個(gè)窗口來(lái)進(jìn)行銷(xiāo)售,請(qǐng)編寫(xiě)多線(xiàn)程程序來(lái)模擬這個(gè)效果。
1 線(xiàn)程類(lèi)
測(cè)試方法:
public static void main(String[] args) { MyThread t1 = new MyThread("窗口1"); MyThread t2 = new MyThread("窗口1"); MyThread t3 = new MyThread("窗口1"); t1.start(); t2.start(); t3.start(); }
1.1 局部加鎖
public class MyThread extends Thread{ private static int ticket = 1000; private static Object obj = new Object(); public MyThread(String name) { super(name); } @Override public void run() { while(ticket > 0){ synchronized(obj){ if(ticket > 0){ System.out.println(Thread.currentThread().getName() + "正在銷(xiāo)售第" +(1001-ticket)+ "張票"); ticket--; } if(ticket <= 0){ System.out.println(Thread.currentThread().getName() + "票已售罄"); } } } } }
1.2 方法加鎖
public class MyThread extends Thread{ private static int ticket = 1000; public MyThread(String name) { super(name); } @Override public void run() { while(ticket > 0){ method02(); } } //鎖對(duì)象:類(lèi)的字節(jié)碼文件對(duì)象(MyThread.class),有static修飾 public static synchronized void method02(){ if(ticket > 0){ System.out.println(Thread.currentThread().getName() + "正在銷(xiāo)售第" +(1001-ticket)+ "張票"); ticket--; } if(ticket <= 0){ System.out.println(Thread.currentThread().getName() + "票已售完"); } } }
1.3 手動(dòng)加鎖
public class MyThread extends Thread{ private static int ticket = 1000; private static Lock lock = new ReentrantLock(); public MyThread(String name) { super(name); } @Override public void run() { while(ticket > 0){ lock.lock();//手動(dòng)上鎖 if(ticket > 0){ System.out.println(Thread.currentThread().getName() + "正在銷(xiāo)售第" +(1001-ticket)+ "張票"); ticket--; } if(ticket <= 0){ System.out.println(Thread.currentThread().getName() + "票已售完"); } lock.unlock();//手動(dòng)解鎖 } } }
2 任務(wù)類(lèi)
測(cè)試方法:
public static void main(String[] args) { Task task = new Task(); Thread t1 = new Thread(task, "窗口1"); Thread t2 = new Thread(task, "窗口2"); Thread t3 = new Thread(task, "窗口3"); t1.start(); t2.start(); t3.start(); }
2.1 局部加鎖
public class Task implements Runnable{ private int tickets=1000; @Override public void run() { while(tickets>0){ synchronized (this) { if(tickets > 0) { System.out.printf ("%s窗口正在售出第%d張票\n",Thread.currentThread().getName(),1001-tickets); tickets--; } if(tickets<=0){ System.out.printf("%s窗口售罄\n",Thread.currentThread().getName()); } } } } }
2.2 方法加鎖
public class Task implements Runnable{ private int tickets=1000; @Override public void run() { while(tickets>0){ method(); } } //方法加鎖,沒(méi)有使用static修飾 public synchronized void method(){ if(tickets > 0) { System.out.printf ("%s窗口正在售出第%d張票\n",Thread.currentThread().getName(),1001-tickets); tickets--; } if(tickets<=0){ System.out.printf("%s窗口售罄\n",Thread.currentThread().getName()); } } }
2.3 手動(dòng)加鎖
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Task implements Runnable{ private int tickets=1000; private Lock lock =new ReentrantLock(); @Override public void run() { while(tickets>0){ lock.lock();//手動(dòng)上鎖 if(tickets > 0) { System.out.printf ("%s窗口正在售出第%d張票\n",Thread.currentThread().getName(),1001-tickets); tickets--; } if(tickets<=0){ System.out.printf("%s窗口售罄\n",Thread.currentThread().getName()); } lock.unlock();//手動(dòng)關(guān)鎖 } } }
效果截圖:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- java多線(xiàn)程之火車(chē)售票系統(tǒng)模擬實(shí)例
- 淺析12306售票算法(java版)
- Java多線(xiàn)程之火車(chē)售票系統(tǒng)
- Java多線(xiàn)程窗口售票問(wèn)題實(shí)例
- Java多線(xiàn)程模擬電影售票過(guò)程
- Java多線(xiàn)程模擬售票程序和線(xiàn)程安全問(wèn)題
- java多線(xiàn)程之鐵路售票系統(tǒng)
- Java多線(xiàn)程之簡(jiǎn)單模擬售票功能
- Java實(shí)戰(zhàn)之多線(xiàn)程模擬站點(diǎn)售票
- java實(shí)現(xiàn)自動(dòng)售貨機(jī)
相關(guān)文章
Spring Cloud Config RSA簡(jiǎn)介及使用RSA加密配置文件的方法
Spring Cloud 為開(kāi)發(fā)人員提供了一系列的工具來(lái)快速構(gòu)建分布式系統(tǒng)的通用模型 。本文重點(diǎn)給大家介紹Spring Cloud Config RSA簡(jiǎn)介及使用RSA加密配置文件的方法,感興趣的朋友跟隨腳步之家小編一起學(xué)習(xí)吧2018-05-05Selenium+Tesseract-OCR智能識(shí)別驗(yàn)證碼爬取網(wǎng)頁(yè)數(shù)據(jù)的實(shí)例
本文主要介紹了Selenium+Tesseract-OCR智能識(shí)別驗(yàn)證碼爬取網(wǎng)頁(yè)數(shù)據(jù),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09Springboot使用Junit測(cè)試沒(méi)有插入數(shù)據(jù)的原因
這篇文章主要介紹了Springboot使用Junit測(cè)試沒(méi)有插入數(shù)據(jù)的原因,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04解析Spring Data JPA的Audit功能之審計(jì)數(shù)據(jù)庫(kù)變更
Spring Data JPA 提供了Audit審計(jì)功能,用來(lái)記錄創(chuàng)建時(shí)間、創(chuàng)建人、修改時(shí)間、修改人等,下面來(lái)詳細(xì)講解下審計(jì)數(shù)據(jù)庫(kù)變更2021-06-06舉例講解Java的Hibernate框架中的多對(duì)一和一對(duì)多映射
這篇文章主要介紹了Java的Hibernate框架中的多對(duì)一和一對(duì)多映射,Hibernate是Java的SSH三大web開(kāi)發(fā)框架之一,需要的朋友可以參考下2015-12-12關(guān)于在IDEA中SpringBoot項(xiàng)目中activiti工作流的使用詳解
這篇文章主要介紹了關(guān)于在IDEA中SpringBoot項(xiàng)目中activiti工作流的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08java中LinkedList使用迭代器優(yōu)化移除批量元素原理
本文主要介紹了java中LinkedList使用迭代器優(yōu)化移除批量元素原理,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10