javaマルチスレッドの列車チケット販売システムのシミュレーション例


1.はじめに
マルチスレッドの共有と通信を学ぶために、私たちは列車の切符販売システムをシミュレートして、10枚の列車の切符があると仮定して、3つの窓口(つまり3つのスレッド)が同時に切符を販売します。
2.非同期コード

package com.tl.skyLine.thread; 
 
/** 
 * Created by tl on 17/3/6. 
 */ 
public class SellTicket { 
 
  public static void main(String[] args) { 
    TicketWindow tw = new TicketWindow(); 
    Thread t1 = new Thread(tw, "    "); 
    Thread t2 = new Thread(tw, "    "); 
    Thread t3 = new Thread(tw, "    "); 
    t1.start(); 
    t2.start(); 
    t3.start(); 
  } 
} 
 
class TicketWindow implements Runnable { 
  private int tickets = 10; 
 
  @Override 
  public void run() { 
    while (true) { 
      if (tickets > 0) { 
        System.out.println("    :" + tickets + " "); 
        tickets--; 
        System.out.println(Thread.currentThread().getName() + "       ,  " + tickets + " "); 
      } else { 
        System.out.println("    ,    !"); 
//        wait,notify notifyAll                    , sleep          
        try { 
          Thread.sleep(1000 * 60 * 5); 
        } catch (InterruptedException e) { 
          e.printStackTrace(); 
        } 
      } 
    } 
  } 
} 
印刷結果:

    :10  
    :10  
    :10  
           ,  7  
    :7  
           ,  8  
           ,  9  
    :6  
    :6  
           ,  6  
    :4  
           ,  4  
    :3  
           ,  5  
           ,  2  
    :2  
           ,  1  
    :1  
           ,  0  
    ,    ! 
           ,  3  
    ,    ! 
    :2  
           ,  -1  
    ,    ! 
上記の結果、三つのスレッドが同時に一つの任務にアクセスできるため、切符販売任務が残っています。このような非現実的な問題が発生したのは、ある瞬間に、ticketsが1であると仮定して、tickets>0がtrueであり、Aスレッドがticketsに実行されています。このラインコードはまだマイナスされていません。また、もう一つのスレッドBはタイミングよくタイムテーブル>0のラインコードに実行され、成功したと判断し、チケットの販売を開始しました。この時、Aスレッドからチケットを1枚差し引いて、チケットはtickets=0、そしてBスレッドからもう1枚引いて、残り-1枚です。したがって、同期ロックはsynchronizedが必要です。ある時間にチケット販売機能を実行するスレッドが一つしかないことを保証します。
3.同期コード

package com.tl.skyLine.thread; 
 
/** 
 * Created by tl on 17/3/6. 
 */ 
public class SellTicket { 
 
  public static void main(String[] args) { 
    TicketWindow tw = new TicketWindow(); 
    Thread t1 = new Thread(tw, "    "); 
    Thread t2 = new Thread(tw, "    "); 
    Thread t3 = new Thread(tw, "    "); 
    t1.start(); 
    t2.start(); 
    t3.start(); 
  } 
} 
 
class TicketWindow implements Runnable { 
  private int tickets = 10; 
 
  @Override 
  public synchronized void run() { 
    while (true) { 
      if (tickets > 0) { 
        System.out.println(Thread.currentThread().getName() + "    ,    :" + tickets + " "); 
        tickets--; 
        System.out.println(Thread.currentThread().getName() + "       ,  " + tickets + " "); 
      } else { 
        System.out.println("    ,    !"); 
//        wait,notify notifyAll                    , sleep          
        try { 
          Thread.sleep(1000 * 60 * 5); 
        } catch (InterruptedException e) { 
          e.printStackTrace(); 
        } 
      } 
    } 
  } 
} 
等しい:

class TicketWindow implements Runnable {                                           
  private int tickets = 10;                                                 
                                                               
  @Override                                                         
  public void run() {                                                    
    while (true) {                                                    
      synchronized (this) {                                               
        if (tickets > 0) {                                              
          System.out.println(Thread.currentThread().getName() + "    ,    :" + tickets + " ");           
          tickets--;                                                
          System.out.println(Thread.currentThread().getName() + "       ,  " + tickets + " ");           
        } else {                                                   
          System.out.println("    ,    !");                                     
//        wait,notify notifyAll                    , sleep                                   
          try {                                                   
            Thread.sleep(1000 * 60 * 5);                                     
          } catch (InterruptedException e) {                                    
            e.printStackTrace();                                         
          }                                                     
        }                                                       
      }                                                         
    }                                                           
  }                                                             
}              
結果:

        ,    :10  
           ,  9  
        ,    :9  
           ,  8  
        ,    :8  
           ,  7  
        ,    :7  
           ,  6  
        ,    :6  
           ,  5  
        ,    :5  
           ,  4  
        ,    :4  
           ,  3  
        ,    :3  
           ,  2  
        ,    :2  
           ,  1  
        ,    :1  
           ,  0  
    ,    ! 
synchronized:
synchronizedはJavaのキーワードで、同期ロックです。その修飾の対象は以下のような種類があります。
1.コードブロックを修飾し、修飾されたコードブロックを同期文ブロックと呼び、その作用の範囲は大括弧{}で囲まれたコードであり、作用の対象はこのコードブロックを呼び出す対象である。
2.一つの方法を修飾し、修飾された方法を同期方法と呼び、その作用の範囲は全体方法であり、作用の対象はこの方法を呼び出す対象である。
3.静的な方法を変更します。作用の範囲は全体的な静的な方法です。作用の対象はこの種類のすべてのオブジェクトです。
4.クラスを変更して、その役割の範囲はsynchronizedの後ろの括弧で囲まれた部分で、役割主のオブジェクトはこの種類のすべてのオブジェクトです。
以上のjavaマルチスレッドの列車チケット販売システムのシミュレーション例は、小編集が皆さんに提供した内容の全部です。参考にしてもらいたいです。どうぞよろしくお願いします。