@Override
	public void run(TaskMonitor monitor) {

		// Do not create this in the constructor.  Some jobs never get started and thus are never
		// cancelled.  In that case, the accumulator's SwingUpdateManager never gets disposed.
		this.incrementalAccumulator = new IncrementalUpdatingAccumulator();

		notifyStarted(monitor);
		boolean error = false;
		try {
			doExecute(monitor);
		}
		catch (Exception e) {
			// InterruptedException handled via notification below
			if (!hasCause(e, InterruptedException.class) && !monitor.isCancelled()) {
				// TODO: is there a better way to handle exceptions?  If we don't grab it and show
				// it here, then it will be handled by the Worker, which just prints it to the
				// console. Plus, handling it here gives us a chance to notify that the process is
				// complete.
				String name = threadedModel.getName();
				error = true;
				Msg.showError(this, null, "Unexpected Exception",
					"Unexpected exception loading table model \"" + name + "\"", e);
			}
		}

		boolean interrupted = Thread.currentThread().isInterrupted();
		notifyCompleted(hasBeenCancelled(monitor) || interrupted || error);

		// all data should have been posted at this point; clean up any data left in the accumulator
		incrementalAccumulator.clear();
	}
Used to signal that the updateManager has finished loading the final contents gathered
by this job.  This is also updated if this job is cancelled.
Ghidra/Framework/Docking/src/main/java/docking/widgets/table/threaded/IncrementalLoadJob.java