1 | sclass MultiSleeper extends RestartableCountdown is ISleeper {
|
2 | MultiSetMap<Timestamp, Runnable> entries = treeMultiSetMap(); |
3 | |
4 | void check {
|
5 | var time = nextWakeUpTime(); |
6 | var action = firstValue(entries); |
7 | setTargetTime(time == null ? 0 : time.sysTime(), r {
|
8 | Set<Runnable> toCall; |
9 | synchronized(MultiSleeper.this) {
|
10 | toCall = entries.get(time); |
11 | entries.remove(time); |
12 | check(); |
13 | } |
14 | pcallFAll(toCall); |
15 | }); |
16 | } |
17 | |
18 | synchronized void removeEntry(Timestamp targetTime, Runnable action) {
|
19 | entries.remove(targetTime, action); |
20 | } |
21 | |
22 | // API |
23 | |
24 | synchronized Timestamp nextWakeUpTime() {
|
25 | ret firstKey(entries); |
26 | } |
27 | |
28 | public synchronized Sleeping doLater(Timestamp targetTime, Runnable r) {
|
29 | if (r == null || targetTime == null) null; |
30 | targetTime = max(targetTime, tsNow()); |
31 | entries.put(targetTime, r); |
32 | check(); |
33 | ret new Sleeping(targetTime, r) {
|
34 | close {
|
35 | removeEntry(targetTime, r); |
36 | } |
37 | }; |
38 | } |
39 | } |
Began life as a copy of #1033563
download show line numbers debug dex old transpilations
Travelled to 3 computer(s): elmgxqgtpvxh, mqqgnosmbjvj, wnsclhtenguj
No comments. add comment
| Snippet ID: | #1036583 |
| Snippet name: | MultiSleeper backup |
| Eternal ID of this version: | #1036583/1 |
| Text MD5: | abf7ec4f3dc76e8bb2791154c2f482be |
| Author: | stefan |
| Category: | javax / timers |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2023-03-22 14:54:09 |
| Source code size: | 1038 bytes / 39 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 357 / 383 |
| Referenced in: | [show references] |