protected void doSettled() {
		List<Consumer<T>> ls;
		CompletableFuture<T> promise;
		synchronized (this) {
			alarm = null;

			// Avoid synchronization issues
			ls = new ArrayList<>(this.listeners); // This seems wasteful

			promise = settledPromise;
			settledPromise = null;
		}
		for (Consumer<T> listener : ls) {
			listener.accept(lastContact);
		}
		if (promise != null) {
			promise.complete(lastContact);
		}
	}
Remove a listener from the settled event

@param listener the listener
Ghidra/Framework/Generic/src/main/java/ghidra/async/AsyncDebouncer.java