void sort(TableSortingContext<T> sortingContext, boolean forceSort) {
		synchronized (addRemoveUpdater) {
			if (currentJob != null && pendingJob == null &&
				currentJob.requestSort(sortingContext, forceSort)) {
				return;
			}

			if (pendingJob != null && pendingJob.requestSort(sortingContext, forceSort)) {
				return;
			}

			runJob(new SortJob<>(model, monitor, sortingContext, forceSort));
		}
	}
Tells this update manager that the table data needs to be resorted.  If a current job
is running, it will attempt to add the sort work directly to the running job.  If the running
job has not gotten to the sort phase yet, the new sort will replace the currently scheduled sort.
If the current job is sorting or has already sorted, it will be interrupted and return to
the sorted state.
<p>
If a pending job is already waiting, the sort will be added to the pending job.
<p>
If no jobs exists, a new job will be created to do the sort and runJob will be called to
start a thread to do the work.

@param sortingContext the context used to sort the data
@param forceSort True signals to re-sort the data (useful when the data changes and needs
                 to be re-sorted.
Ghidra/Framework/Docking/src/main/java/docking/widgets/table/threaded/ThreadedTableModelUpdateMgr.java