最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java多線程模擬實(shí)現(xiàn)售票功能

 更新時(shí)間:2021年08月27日 13:23:04   作者:最好的碩碩  
這篇文章主要為大家詳細(xì)介紹了java多線程模擬實(shí)現(xiàn)售票功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

鐵道部發(fā)布了一個(gè)售票任務(wù),要求銷售1000張票,要求有3個(gè)窗口來進(jìn)行銷售,請(qǐng)編寫多線程程序來模擬這個(gè)效果。

1 線程類

測(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() + "正在銷售第" +(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ì)象:類的字節(jié)碼文件對(duì)象(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 手動(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() + "正在銷售第" +(1001-ticket)+ "張票");
    ticket--;
   }
   if(ticket <= 0){
    System.out.println(Thread.currentThread().getName() + "票已售完");
   }
   lock.unlock();//手動(dòng)解鎖
  }
 }
}

2 任務(wù)類

測(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();  
  } 
 } 
    //方法加鎖,沒有使用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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java多線程之間日志traceId傳遞方式

    Java多線程之間日志traceId傳遞方式

    這篇文章主要介紹了Java多線程之間日志traceId傳遞方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • SpringBoot整合Web開發(fā)之文件上傳與@ControllerAdvice

    SpringBoot整合Web開發(fā)之文件上傳與@ControllerAdvice

    @ControllerAdvice注解是Spring3.2中新增的注解,學(xué)名是Controller增強(qiáng)器,作用是給Controller控制器添加統(tǒng)一的操作或處理。對(duì)于@ControllerAdvice,我們比較熟知的用法是結(jié)合@ExceptionHandler用于全局異常的處理,但其作用不止于此
    2022-08-08
  • 使用Lombok子類繼承父類,父類屬性不生效問題及解決

    使用Lombok子類繼承父類,父類屬性不生效問題及解決

    在使用Lombok庫(kù)時(shí),若子類繼承父類,父類的屬性可能不會(huì)自動(dòng)生效,為解決此問題,可通過在父類上添加@Getter和@Setter注解,或使用@SuperBuilder注解來確保父類屬性在子類中有效,同時(shí),需注意確保Lombok版本一致且正確配置了相關(guān)插件
    2024-10-10
  • spring?項(xiàng)目實(shí)現(xiàn)限流方法示例

    spring?項(xiàng)目實(shí)現(xiàn)限流方法示例

    這篇文章主要為大家介紹了spring項(xiàng)目實(shí)現(xiàn)限流的方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • SpringBoot超詳細(xì)深入講解底層原理

    SpringBoot超詳細(xì)深入講解底層原理

    我們知道springboot內(nèi)部是通過spring框架內(nèi)嵌Tomcat實(shí)現(xiàn)的,當(dāng)然也可以內(nèi)嵌jetty,undertow等等web框架;另外springboot還有一個(gè)特別重要的功能就是自動(dòng)裝配,這又是如何實(shí)現(xiàn)的呢
    2022-07-07
  • 使用easyexcel導(dǎo)出的excel文件,使用poi讀取時(shí)異常處理方案

    使用easyexcel導(dǎo)出的excel文件,使用poi讀取時(shí)異常處理方案

    這篇文章主要介紹了使用easyexcel導(dǎo)出的excel文件,使用poi讀取時(shí)異常處理方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 總結(jié)java多線程之互斥與同步解決方案

    總結(jié)java多線程之互斥與同步解決方案

    文中總結(jié)了線程互斥與同步,synchronized使用細(xì)節(jié)及原理,Reentrylock使用細(xì)節(jié)等知識(shí),對(duì)解決Java多線程互斥與同步等問題很有效,,需要的朋友可以參考下
    2021-05-05
  • Java 詳解循環(huán)屏障CyclicBarrier如何實(shí)現(xiàn)多線程分段等待執(zhí)行完成

    Java 詳解循環(huán)屏障CyclicBarrier如何實(shí)現(xiàn)多線程分段等待執(zhí)行完成

    CyclicBarrier是一個(gè)同步工具類,可以翻譯成循環(huán)屏障,也叫障礙器或同步屏障。CyclicBarrier內(nèi)部有一個(gè)計(jì)數(shù)器count,調(diào)用障礙器的await方法會(huì)使計(jì)數(shù)器count的值減一,當(dāng)計(jì)數(shù)器count的值為0時(shí),表明調(diào)用了await方法線程已經(jīng)達(dá)到了設(shè)置的數(shù)量
    2021-11-11
  • Java8學(xué)習(xí)教程之lambda表達(dá)式語法介紹

    Java8學(xué)習(xí)教程之lambda表達(dá)式語法介紹

    眾所周知lambda表達(dá)式是JAVA8中提供的一種新的特性,它支持Java也能進(jìn)行簡(jiǎn)單的“函數(shù)式編程”。 下面這篇文章主要給大家介紹了關(guān)于Java8學(xué)習(xí)教程之lambda表達(dá)式語法的相關(guān)資料,需要的朋友可以參考下。
    2017-09-09
  • Java字符串相關(guān)類使用方法詳解

    Java字符串相關(guān)類使用方法詳解

    String、StringBuilder、StringBuffer還傻傻分不清,下面這篇文章主要給大家介紹了關(guān)于Java字符串相關(guān)類使用的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07

最新評(píng)論

南投市| 沧州市| 天水市| 眉山市| 大城县| 子洲县| 南通市| 正镶白旗| 镇平县| 南木林县| 武穴市| 盐津县| 顺义区| 疏勒县| 卢龙县| 甘泉县| 靖远县| 平南县| 聂荣县| 宁南县| 盐津县| 肇州县| 麻阳| 新和县| 朝阳区| 东兰县| 电白县| 大埔县| 阿拉善左旗| 贵州省| 呼伦贝尔市| 龙岩市| 九龙坡区| 永济市| 兴国县| 南汇区| 象州县| 孟村| 大渡口区| 三都| 新化县|