@Override public void addListener(Runnable listener, Executor exec) { executionList.add(listener, exec); // When a listener is first added, we run a task that will wait for the delegate to finish, // and when it is done will run the listeners. if (hasListeners.compareAndSet(false, true)) { if (delegate.isDone()) { // If the delegate is already done, run the execution list immediately on the current // thread. executionList.execute(); return; } // TODO(lukes): handle RejectedExecutionException adapterExecutor.execute( new Runnable() { @Override public void run() { try { /* * Threads from our private pool are never interrupted. Threads from a * user-supplied executor might be, but... what can we do? This is another reason * to return a proper ListenableFuture instead of using listenInPoolThread. */ getUninterruptibly(delegate); } catch (Throwable e) { // ExecutionException / CancellationException / RuntimeException / Error // The task is presumably done, run the listeners. } executionList.execute(); } }); } }
void execute() { try { executor.execute(runnable); return; } catch (RuntimeException runtimeexception) { ExecutionList.access$000().log(Level.SEVERE, (new StringBuilder()).append("RuntimeException while executing runnable ").append(runnable).append(" with executor ").append(executor).toString(), runtimeexception); } }
protected void done() { executionList.execute(); }
public void addListener(Runnable runnable, Executor executor) { executionList.add(runnable, executor); }