-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathIndex.ets
More file actions
147 lines (125 loc) · 3.77 KB
/
Copy pathIndex.ets
File metadata and controls
147 lines (125 loc) · 3.77 KB
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import {
SynStart,
SynEnd,
wait,
notify,
SharedBoolean,
SharedString,
SharedNumber,
Syc,
isMainThread,
addFunc,
Runnable,
Thread,
} from './ThreadBridge';
export function sharedWash(runnable: Runnable) {
let archetype: Runnable;
if (runnable.className === 'BuyBook') {
archetype = new BuyBook(new MoneyCounter(), 'DefaultUser', 0);
} else if (runnable.className === 'BuyFood') {
archetype = new BuyFood(new MoneyCounter(), 'DefaultUser', 0);
} else if (runnable.className === 'BuyTicket') {
archetype = new BuyTicket(new MoneyCounter(), 'DefaultUser', 0);
} else {
archetype = new Thread();
}
addFunc(runnable, archetype);
runnable.run();
}
class MoneyCounter {
public syn: Syc = new Syc();
public static staticSyn: Syc = new Syc();
public className: string = 'MoneyCounter';
private moneyAvailable = new SharedNumber(2000);
public useMoney(userName: string, numberOfMoney: number): void {
{
SynStart(this.syn);
if (numberOfMoney <= this.moneyAvailable.getValue()) {
this.moneyAvailable.setValue(this.moneyAvailable.getValue() - numberOfMoney);
console.log(
`${userName} used ${numberOfMoney} money. Money left: ${this.moneyAvailable.getValue()}`
);
}
SynEnd(this.syn);
}
}
public getMoneyAvailable(): number {
{
SynStart(this.syn);
const result = this.moneyAvailable.getValue();
SynEnd(this.syn);
return result;
}
}
}
class BuyBook implements Runnable {
public syn: Syc = new Syc();
public static staticSyn: Syc = new Syc();
public className: string = 'BuyBook';
private moneyCounter: MoneyCounter;
private userName = new SharedString();
private price = new SharedNumber();
constructor(moneyCounter: MoneyCounter, userName: string, price: number) {
this.moneyCounter = moneyCounter;
this.userName.setValue(userName);
this.price.setValue(price);
}
run(): void {
while (true) {
this.moneyCounter.useMoney(this.userName.getValue(), this.price.getValue());
}
}
}
class BuyFood implements Runnable {
public syn: Syc = new Syc();
public static staticSyn: Syc = new Syc();
public className: string = 'BuyFood';
private moneyCounter: MoneyCounter;
private userName = new SharedString();
private price = new SharedNumber();
constructor(moneyCounter: MoneyCounter, userName: string, price: number) {
this.moneyCounter = moneyCounter;
this.userName.setValue(userName);
this.price.setValue(price);
}
run(): void {
while (true) {
this.moneyCounter.useMoney(this.userName.getValue(), this.price.getValue());
}
}
}
class BuyTicket implements Runnable {
public syn: Syc = new Syc();
public static staticSyn: Syc = new Syc();
public className: string = 'BuyTicket';
private moneyCounter: MoneyCounter;
private userName = new SharedString();
private price = new SharedNumber();
constructor(moneyCounter: MoneyCounter, userName: string, price: number) {
this.moneyCounter = moneyCounter;
this.userName.setValue(userName);
this.price.setValue(price);
}
run(): void {
while (true) {
this.moneyCounter.useMoney(this.userName.getValue(), this.price.getValue());
}
}
}
class UseMoneyTest {
public syn: Syc = new Syc();
public static staticSyn: Syc = new Syc();
public className: string = 'UseMoneyTest';
static main(args: string[]): void {
const moneyCounter = new MoneyCounter();
const thread1 = new Thread(new BuyBook(moneyCounter, 'User1', 5));
const thread2 = new Thread(new BuyFood(moneyCounter, 'User2', 10));
const thread3 = new Thread(new BuyTicket(moneyCounter, 'User3', 20));
thread1.start();
thread2.start();
thread3.start();
}
}
if (isMainThread()) {
// You can put the entry of your code here to test.
}