private void scheduleMerge() {

		mergeMonitor.setProgress(currentIndex + 1);

		SwingUtilities.invokeLater(() -> {
			if (currentIndex < mergeResolvers.length && !isCancelled) {
				mergePlugin.updateMergeDescription(mergeResolvers[currentIndex].getDescription());
			}
		});

		MonitoredRunnable r = monitor -> {
			monitor.initialize(0);
			final String description = mergeResolvers[currentIndex].getDescription();
			monitor.setMessage(description); // The fire breathing dialog.
			mergeMonitor.setMessage(description); // The detail monitor at bottom right of merge tool.
			updateProgress(0, description); // The current phase progress area in the default merge panel.

			try {
				mergeResolvers[currentIndex].merge(monitor);
				if (mergeToolIsVisible) {
					showDefaultMergePanel(description);
				}
				++currentIndex;
				if (currentIndex == mergeResolvers.length || monitor.isCancelled()) {
					conflictsResolveCompleted();
				}
				else {
					// schedule next MergeResolver to run
					scheduleMerge();
				}

			}
			catch (final Exception e) {
				MergeManager.showBlockingError("Error During Merge",
					"Error occurred in " + mergeResolvers[currentIndex].getName(), e);
				mergeStatus = false;
				conflictsResolveCompleted();
			}
		};

		if (currentIndex < mergeResolvers.length && !isCancelled) {
			runManager.runLater(r, mergeResolvers[currentIndex].getName(), 250);
		}
	}
Schedule the next MergeResolver thread to run.
Ghidra/Features/Base/src/main/java/ghidra/app/merge/MergeManager.java