@Override
		public void run() {
			Program myProgram = program;
			Set<String> myTypes = null;
			synchronized (this) {
				if (types.isEmpty()) {
					// the program has been changed or closed
					return;
				}
				myTypes = types;
				types = new HashSet<>();
				running = true;
			}
			try {
				for (String type : myTypes) {
					updateNav(type);
				}
			}
			catch (Throwable t) {
				// This is squashed due to the nature of this primitive thread.  This thread 
				// may still be running while the program it is working on is changed or 
				// closed.  Since this thread is transient and is just a helper thread to update
				// bookmarks, the decision was made to just squash generated exceptions. 

				// Try a bit to uncover real problems: a disposed updated manager or a different
				// program would signal that this thread has been obsoleted.
				if (!updateMgr.isDisposed() && program == myProgram) {
					Msg.showError(BookmarkPlugin.this, null, "Unexpected Error",
						"Unexpected exception update bookmark markers", t);
				}
			}
			synchronized (this) {
				running = false;
			}
		}
Runner used in thread to update bookmark display in the marker margins.
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/bookmark/BookmarkPlugin.java