java多線程模擬實現(xiàn)售票功能
更新時間:2021年08月27日 13:23:04 作者:最好的碩碩
這篇文章主要為大家詳細介紹了java多線程模擬實現(xiàn)售票功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
鐵道部發(fā)布了一個售票任務,要求銷售1000張票,要求有3個窗口來進行銷售,請編寫多線程程序來模擬這個效果。
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 任務類
測試方法:
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();//手動關鎖
}
}
}
效果截圖:

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
SpringBoot整合Web開發(fā)之文件上傳與@ControllerAdvice
@ControllerAdvice注解是Spring3.2中新增的注解,學名是Controller增強器,作用是給Controller控制器添加統(tǒng)一的操作或處理。對于@ControllerAdvice,我們比較熟知的用法是結(jié)合@ExceptionHandler用于全局異常的處理,但其作用不止于此2022-08-08
使用easyexcel導出的excel文件,使用poi讀取時異常處理方案
這篇文章主要介紹了使用easyexcel導出的excel文件,使用poi讀取時異常處理方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
Java 詳解循環(huán)屏障CyclicBarrier如何實現(xiàn)多線程分段等待執(zhí)行完成
CyclicBarrier是一個同步工具類,可以翻譯成循環(huán)屏障,也叫障礙器或同步屏障。CyclicBarrier內(nèi)部有一個計數(shù)器count,調(diào)用障礙器的await方法會使計數(shù)器count的值減一,當計數(shù)器count的值為0時,表明調(diào)用了await方法線程已經(jīng)達到了設置的數(shù)量2021-11-11

