-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathIndex.ets
More file actions
135 lines (116 loc) · 3.22 KB
/
Copy pathIndex.ets
File metadata and controls
135 lines (116 loc) · 3.22 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
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 === 'AddStockTask') {
archetype = new AddStockTask(new Inventory(0), 0);
} else if (runnable.className === 'RemoveStockTask') {
archetype = new RemoveStockTask(new Inventory(0), 0);
} else {
archetype = new Thread();
}
addFunc(runnable, archetype);
runnable.run();
}
class Inventory {
private stock = new SharedNumber();
public syn: Syc = new Syc();
public static staticSyn: Syc = new Syc();
public className: string = 'Inventory';
constructor(initialStock: number) {
this.stock.setValue(initialStock);
}
public addStock(amount: number): void {
{
SynStart(this.syn);
this.stock.setValue(this.stock.getValue() + amount);
console.log(
` added ${amount} units. Current stock: ${this.stock.getValue()}`
);
SynEnd(this.syn);
}
}
public removeStock(amount: number): void {
{
SynStart(this.syn);
if (amount <= this.stock.getValue()) {
this.stock.setValue(this.stock.getValue() - amount);
console.log(
` removed ${amount} units. Current stock: ${this.stock.getValue()}`
);
} else {
console.log(
` tried to remove ${amount} units, but only ${this.stock.getValue()} units available.`
);
}
SynEnd(this.syn);
}
}
public getStock(): number {
{
SynStart(this.syn);
const currentStock = this.stock.getValue();
SynEnd(this.syn);
return currentStock;
}
}
}
class AddStockTask implements Runnable {
private inventory: Inventory;
private amount = new SharedNumber();
public syn: Syc = new Syc();
public static staticSyn: Syc = new Syc();
public className: string = 'AddStockTask';
constructor(inventory: Inventory, amount: number) {
this.inventory = inventory;
this.amount.setValue(amount);
}
run(): void {
this.inventory.addStock(this.amount.getValue());
}
}
class RemoveStockTask implements Runnable {
public syn: Syc = new Syc();
public static staticSyn: Syc = new Syc();
public className: string = 'RemoveStockTask';
private inventory: Inventory;
private amount = new SharedNumber();
constructor(inventory: Inventory, amount: number) {
this.inventory = inventory;
this.amount.setValue(amount);
}
run(): void {
this.inventory.removeStock(this.amount.getValue());
}
}
class InventoryManagementTest {
public syn: Syc = new Syc();
public static staticSyn: Syc = new Syc();
public className: string = 'InventoryManagementTest';
public static main(args: string[]): void {
const inventory = new Inventory(100);
const thread1 = new Thread(new AddStockTask(inventory, 30));
const thread2 = new Thread(new RemoveStockTask(inventory, 50));
const thread3 = new Thread(new AddStockTask(inventory, 20));
const thread4 = new Thread(new RemoveStockTask(inventory, 70));
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
}
if (isMainThread()) {
InventoryManagementTest.main([]);
}