자바 다 중 스 레 드 기차 매 표 시스템 시 뮬 레이 션
6866 단어 자바다 중 스 레 드시 뮬 레이 션 티켓 팅
다 중 스 레 드 공유 와 통신 을 배우 기 위해 우 리 는 기차 매 표 시스템 을 모 의 하여 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 뒤에 괄호 로 묶 인 부분 이 고 역할 주의 대상 은 이 유형의 모든 대상 입 니 다.
이상 의 자바 다 중 스 레 드 기차 매 표 시스템 시 뮬 레이 션 인 스 턴 스 는 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 께 참고 가 되 고 여러분 들 이 저 희 를 많이 지지 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.