java多線程模擬實現(xiàn)售票功能
鐵道部發(fā)布了一個售票任務(wù),要求銷售1000張票,要求有3個窗口來進(jìn)行銷售,請編寫多線程程序來模擬這個效果。
1 線程類
測試方法:
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() + "正在銷售第" +(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(); } } //鎖對象:類的字節(jié)碼文件對象(MyThread.class),有static修飾 public static synchronized void method02(){ if(ticket > 0){ System.out.println(Thread.currentThread().getName() + "正在銷售第" +(1001-ticket)+ "張票"); ticket--; } if(ticket <= 0){ System.out.println(Thread.currentThread().getName() + "票已售完"); } } }
1.3 手動加鎖
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();//手動上鎖 if(ticket > 0){ System.out.println(Thread.currentThread().getName() + "正在銷售第" +(1001-ticket)+ "張票"); ticket--; } if(ticket <= 0){ System.out.println(Thread.currentThread().getName() + "票已售完"); } lock.unlock();//手動解鎖 } } }
2 任務(wù)類
測試方法:
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(); } } //方法加鎖,沒有使用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 手動加鎖
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();//手動上鎖 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();//手動關(guān)鎖 } } }
效果截圖:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Cloud Config RSA簡介及使用RSA加密配置文件的方法
Spring Cloud 為開發(fā)人員提供了一系列的工具來快速構(gòu)建分布式系統(tǒng)的通用模型 。本文重點給大家介紹Spring Cloud Config RSA簡介及使用RSA加密配置文件的方法,感興趣的朋友跟隨腳步之家小編一起學(xué)習(xí)吧2018-05-05Selenium+Tesseract-OCR智能識別驗證碼爬取網(wǎng)頁數(shù)據(jù)的實例
本文主要介紹了Selenium+Tesseract-OCR智能識別驗證碼爬取網(wǎng)頁數(shù)據(jù),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-09-09Springboot使用Junit測試沒有插入數(shù)據(jù)的原因
這篇文章主要介紹了Springboot使用Junit測試沒有插入數(shù)據(jù)的原因,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04解析Spring Data JPA的Audit功能之審計數(shù)據(jù)庫變更
Spring Data JPA 提供了Audit審計功能,用來記錄創(chuàng)建時間、創(chuàng)建人、修改時間、修改人等,下面來詳細(xì)講解下審計數(shù)據(jù)庫變更2021-06-06舉例講解Java的Hibernate框架中的多對一和一對多映射
這篇文章主要介紹了Java的Hibernate框架中的多對一和一對多映射,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2015-12-12關(guān)于在IDEA中SpringBoot項目中activiti工作流的使用詳解
這篇文章主要介紹了關(guān)于在IDEA中SpringBoot項目中activiti工作流的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08java中LinkedList使用迭代器優(yōu)化移除批量元素原理
本文主要介紹了java中LinkedList使用迭代器優(yōu)化移除批量元素原理,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10