자바 다 중 스 레 드 기차 매 표 시스템 시 뮬 레이 션

1.머리말
다 중 스 레 드 공유 와 통신 을 배우 기 위해 우 리 는 기차 매 표 시스템 을 모 의 하여 10 장의 기차표 가 있다 고 가정 하고 세 개의 창구(즉 세 개의 스 레 드)가 동시에 매 표를 한다.
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  
    ,    ! 
위의 결 과 를 통 해 알 수 있 듯 이 세 개의 스 레 드 가 한 가지 미 션 을 동시에 방문 할 수 있 기 때문에 티켓 판매 미 션 은 기차표 가-1 장 남 았 다 는 현실 에 맞지 않 는 문제 가 발생 할 수 있 습 니 다.그 이 유 는 특정한 순간 에 tickets 가 1 이 라 고 가정 할 때 tickets>0 은 true 이 고 A 스 레 드 는 tickets--이 줄 코드 로 운행 되 는데 이때 1 을 빼 지 않 았 기 때 문 입 니 다.이 동시에 다른 스 레 드 B 는 tickets>0 이라는 줄 코드 를 실 행 했 습 니 다.성공 적 으로 판단 하여 매 표를 실행 하기 시 작 했 습 니 다.이때 A 스 레 드 는 표 한 장 을 빼 고 tickets=0 을 뺀 다음 에 B 스 레 드 는 한 장 을 빼 면-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 는 자바 의 키워드 로 동기 화 자물쇠 입 니 다.그것 이 수식 하 는 대상 은 다음 과 같은 몇 가지 가 있다.
1.코드 블록 을 수식 합 니 다.수 정 된 코드 블록 을 동기 화 구문 블록 이 라 고 합 니 다.그 역할 의 범 위 는 큰 괄호{}로 묶 인 코드 이 고 역할 의 대상 은 이 코드 블록 을 호출 하 는 대상 입 니 다.
2.하나의 방법 을 수식 하고 수 정 된 방법 을 동기 화 방법 이 라 고 하 는데 그 역할 의 범 위 는 전체 방법 이 고 역할 의 대상 은 이 방법 을 호출 하 는 대상 이다.
3.정태 적 인 방법 을 수정 하면 그 역할 의 범 위 는 전체 정태 적 인 방법 이 고 역할 의 대상 은 이런 유형의 모든 대상 이다.
4.클래스 를 수정 합 니 다.그 역할 의 범 위 는 synchronized 뒤에 괄호 로 묶 인 부분 이 고 역할 주의 대상 은 이 유형의 모든 대상 입 니 다.
이상 의 자바 다 중 스 레 드 기차 매 표 시스템 시 뮬 레이 션 인 스 턴 스 는 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 께 참고 가 되 고 여러분 들 이 저 희 를 많이 지지 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기