/
Shop.java
97 lines (81 loc) · 1.97 KB
/
Shop.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package ru.spbstu.telematics.student_Nikitin.lab3_Queue;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Condition;
public class Shop {
private final int _maxTicketNum;
private int _ticketNum;
private int _servicedNum;
private boolean _serviceBusy;
private boolean _ticketMachineBusy;
private Lock _lockTicketMachine = new ReentrantLock();
private Lock _lockService = new ReentrantLock();
private Condition _condTicketMachine = _lockTicketMachine.newCondition();
private Condition _condService = _lockService.newCondition();
public Shop(){
_maxTicketNum = 20;
_ticketNum = 1;
_servicedNum = 1;
_serviceBusy = false;
_ticketMachineBusy = false;
}
public void startTakingTicket(){
_lockTicketMachine.lock();
if(_ticketMachineBusy){
try {
_condTicketMachine.await();
}catch (InterruptedException e) {
e.printStackTrace();
}
finally{
_ticketMachineBusy = true;
_lockTicketMachine.unlock();
}
}
if(!_ticketMachineBusy){
_ticketMachineBusy = true;
_lockTicketMachine.unlock();
}
}
public int finishTakingTicket(){
int tempTicketNum;
_lockTicketMachine.lock();
_ticketMachineBusy = false;
tempTicketNum = _ticketNum;
if(_ticketNum < _maxTicketNum)
_ticketNum ++;
else
_ticketNum = 1;
_condTicketMachine.signal();
_lockTicketMachine.unlock();
return tempTicketNum;
}
public void startService(){
_lockService.lock();
if(_serviceBusy){
try {
_condService.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
finally {
_serviceBusy = true;
_lockService.unlock();
}
}
if(!_serviceBusy){
_serviceBusy = true;
_lockService.unlock();
}
}
public void finishService(){
_lockService.lock();
if(_servicedNum < _maxTicketNum)
_servicedNum ++;
else
_servicedNum = 1;
_serviceBusy = false;
_condService.signal();
_lockService.unlock();
}
}