!7 static JTextField tf; static JTextArea textArea; sclass ConcurrentEvaluator { new L functions; L results = synchroList(); ExecutorService executorService; O onNewResult; // Runnable or voidfunc(int) void add(O f) { functions.add(f); } void start() { executorService = Executors.newFixedThreadPool(numberOfCoresToUse()); while (l(results) < l(functions)) results.add(null); for _i over functions: { final int i = _i; executorService.execute(r { results.set(i, pcallF(functions.get(i))); onNewResult(i); }); } } void onNewResult(int i) { pcallF(onNewResult, i); } L results() { ret cloneList(results); } } p-substance { showFrame(northAndCenter(tf = jtextfield(), textArea = jtextarea())); final ReliableSingleThread thread = new(f update); onEnter(tf, r { thread.trigger() }); } svoid update { final new ConcurrentEvaluator eval; eval.add(func { ret "Hello at " + now(); }); eval.add(func { sleepSeconds(1); ret "Hello 2 at " + now(); }); eval.onNewResult = r { updateResults(eval) }; eval.start(); } svoid updateResults(ConcurrentEvaluator eval) { L l = notNullOnly(eval.results()); S text = lines(allToString(l)); setText(textArea, text); }