public synchronized <T extends DomainObject> void executeCommand(BackgroundCommand<T> cmd,
			T obj) {
		if (tool == null) {
			return;
		}

		BackgroundCommandTask<T> task = new BackgroundCommandTask<>(this, obj, cmd);
		tasks.addLast(task);

		if (taskThread != null && taskThread.isAlive()) {
			return;
		}

		taskThread = new Thread(taskThreadGroup, this, "Background-Task-" + tool.getName());
		taskThread.setPriority(Thread.MIN_PRIORITY + 1);
		taskThread.start();
		try {
			// Wait for background command task to start its transaction and notify us.
			// This is done to ensure any preceding foreground Command transaction
			// becomes entangled with the task execution.
			wait(1000);
		}
		catch (InterruptedException e) {
			Msg.error(this,
				"Interrupted waiting for the Background Command to start a transaction");
		}
	}
Execute the given command in the background

@param cmd background command
@param obj domain object that supports undo/redo
Ghidra/Framework/Project/src/main/java/ghidra/framework/plugintool/mgr/ToolTaskManager.java