public void schedule(GraphJob job) {

		trace("schedule() - " + job);

		Objects.requireNonNull(job, "Graph job cannot be null");

		if (job.isFinished()) {
			throw new IllegalArgumentException("cannot schedule a finished job!");
		}

		queue.add(job);
		swing(this::shortCutAndRunNextJob);
	}
A class to run {@link GraphJob}s.  This class will queue jobs and will run them
in the Swing thread.  Job implementations may be multi-threaded, as they choose, by managing
threads themselves.    This is different than a typical job runner, which is usually
itself threaded.
<P>
A job is considered finished when {@link #jobFinished(GraphJob)}
is called on this class.  After this callback, the next job will be run.  
<P>
{@link #setFinalJob(GraphJob)} sets a job to be run last, after all jobs in the queue
have finished.

<P>When a job is added via {@link #schedule(GraphJob)}, any currently running job will 
be told to finish immediately, if it's {@link GraphJob#canShortcut()} returns true.  If it 
cannot be shortcut, then it will be allowed to finish.  Further, this logic will be applied
to each job in the queue.  So, if there are multiple jobs in the queue, which all return
true for {@link GraphJob#canShortcut()}, then they will each be shortcut (allowing them 
to complete) before running the newly scheduled job.

<P>This class is thread-safe in that you can {@link #schedule(GraphJob)} jobs from any
thread.

<P>Synchronization Policy:  the methods that mutate fields of this class or read them 
must be synchronized.
Ghidra/Framework/Graph/src/main/java/ghidra/graph/job/GraphJobRunner.java