sclass ConcurrentEvaluator { new L functions; L results = synchroList(); ExecutorService executorService; O onNewResult; // Runnable or voidfunc(int) volatile bool cancelled; L<Thread> threads = synchroList(); int coresToUse; // if 0, use coresToUse() void add(O f) { functions.add(f); } void addAll(Collection l) { functions.addAll(l); } void start() { executorService = Executors.newFixedThreadPool(coresToUse != 0 ? coresToUse : coresToUse()); while (l(results) < l(functions)) results.add(null); for _i over functions: { final int i = _i; executorService.execute(r { threads.add(currentThread()); try { results.set(i, pcallF(functions.get(i))); ping(); onNewResult(i); } finally { threads.remove(currentThread()); } }); } } void onNewResult(int i) { if (!cancelled) pcallF(onNewResult, i); } L results() { ret cloneList(results); } void cancel { pcall { cancelled = true; executorService.shutdownNow(); cancelThreads(cloneList(threads)); } } void cancelAndWait { long time = sysNow(); cancel(); while (nempty(threads)) sleep(1); sysDone("Cancelling evaluators", time, 10); } bool done() { ret empty(threads); } void startWaitCleanUp { try { start(); while (!done()) sleepSeconds(1); } finally { cancel(); } } }
download show line numbers debug dex old transpilations
Travelled to 13 computer(s): aoiabmzegqzx, bhatertpkbcr, cbybwowwnfue, cfunsshuasjs, gwrvuhgaqvyk, ishqpsrjomds, lpdgvwnxivlt, mqqgnosmbjvj, pyentgdyhuwx, pzhvpgtvlbxg, tslmcundralx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
Snippet ID: | #1008561 |
Snippet name: | ConcurrentEvaluator |
Eternal ID of this version: | #1008561/11 |
Text MD5: | 2925adf721cf2ae3d5352937822b00f7 |
Author: | stefan |
Category: | javax |
Type: | JavaX fragment (include) |
Public (visible to everyone): | Yes |
Archived (hidden from active list): | No |
Created/modified: | 2018-05-01 19:48:38 |
Source code size: | 1515 bytes / 60 lines |
Pitched / IR pitched: | No / No |
Views / Downloads: | 534 / 1141 |
Version history: | 10 change(s) |
Referenced in: | [show references] |