public static void main(String[] args) throws InterruptedException {
		final GhidraTimer t = new GhidraSwinglessTimer(500, null);
		
		TimerCallback callback1 = new TimerCallback() {
			int i = 0;
			@Override
			public void timerFired() {
				System.out.println("A: "+i);
				if (++i == 20) {
					t.stop();
				}
			}
		};
		t.setTimerCallback(callback1);
		t.start();

		final GhidraTimer t2 = new GhidraSwinglessTimer(50, null);
		
		TimerCallback callback2 = new TimerCallback() {
			int i = 0;
			@Override
			public void timerFired() {
				System.out.println("B: "+i);
				if (++i == 100) {
					t2.stop();
				}
			}
		};
		t2.setInitialDelay(250);
		t2.setTimerCallback(callback2);
		t2.start();

		
		System.err.println("waiting");
		Thread.sleep(20000);
		synchronized(GhidraSwinglessTimer.class) {
			if (cleanupTask == null) {
				throw new AssertException("cleanup timer is null");
			}
		}
		
		final GhidraTimer t3 = new GhidraSwinglessTimer(50, null);
		
		TimerCallback callback3 = new TimerCallback() {
			int i = 0;
			@Override
			public void timerFired() {
				System.out.println("C: "+i);
				if (++i == 100) {
					t3.stop();
				}
			}
		};
		t3.setInitialDelay(250);
		t3.setTimerCallback(callback3);
		t3.start();

		
		System.err.println("waiting");
		Thread.sleep(20000);
		synchronized(GhidraSwinglessTimer.class) {
			if (cleanupTask == null) {
				throw new AssertException("cleanup timer is null");
			}
		}

		System.err.println("wait for cleanup;");
		Thread.sleep(CLEANUP_TIMER_THREAD_DELAY);
		synchronized(GhidraSwinglessTimer.class) {
			if (cleanupTask != null) {
				throw new AssertException("cleanup timer did not go away");
			}
		}
		System.err.println("done");
	}
Returns true if the timer is running.
Ghidra/Framework/Generic/src/main/java/generic/timer/GhidraSwinglessTimer.java