@Test public void scanBuffered() throws InterruptedException { ExecutorScheduler.ExecutorSchedulerWorker worker = new ExecutorScheduler.ExecutorSchedulerWorker(task -> new Thread(task, "scanBuffered_NotTrampolining").start()); Runnable task = () -> { System.out.println(Thread.currentThread().getName()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }; try { //the tasks are all added to the list and started on a dedicated thread worker.schedule(task); worker.schedule(task); worker.schedule(task); Thread.sleep(200); //buffered looks at the list of executing and pending tasks, 1 executing and 2 pending assertThat(worker.scan(Scannable.Attr.BUFFERED)).isEqualTo(3); worker.dispose(); assertThat(worker.scan(Scannable.Attr.BUFFERED)).isZero(); } finally { worker.dispose(); } } }
@Override public Object scanUnsafe(Attr key) { if (key == Attr.TERMINATED || key == Attr.CANCELLED) return isDisposed(); if (key == Attr.BUFFERED) return tasks.size(); if (key == Attr.PARENT) return (executor instanceof Scannable) ? executor : null; if (key == Attr.NAME) { //hack to recognize the SingleWorker if (executor instanceof SingleWorkerScheduler) return executor + ".worker"; return Schedulers.FROM_EXECUTOR + "(" + executor + ").worker"; } return Schedulers.scanExecutor(executor, key); } }
@Override public Worker createWorker() { return trampoline ? new ExecutorSchedulerTrampolineWorker(executor) : new ExecutorSchedulerWorker(executor); }
@Override public Worker createWorker() { return new ExecutorScheduler.ExecutorSchedulerWorker(this); }
@Test public void scanParent() { Executor plainExecutor = new PlainExecutor(); Executor scannableExecutor = new ScannableExecutor(); Scheduler.Worker workerScannableParent = new ExecutorScheduler.ExecutorSchedulerWorker(scannableExecutor); Scheduler.Worker workerPlainParent = new ExecutorScheduler.ExecutorSchedulerWorker(plainExecutor); try { assertThat(Scannable.from(workerScannableParent).scan(Scannable.Attr.PARENT)) .as("workerScannableParent") .isSameAs(scannableExecutor); assertThat(Scannable.from(workerPlainParent).scan(Scannable.Attr.PARENT)) .as("workerPlainParent") .isNull(); } finally { workerPlainParent.dispose(); workerScannableParent.dispose(); } }
@Test public void scanParent() { Executor plainExecutor = new ExecutorSchedulerTest.PlainExecutor(); Executor scannableExecutor = new ExecutorSchedulerTest.ScannableExecutor(); Scheduler.Worker workerScannableParent = new ExecutorScheduler.ExecutorSchedulerWorker(scannableExecutor); Scheduler.Worker workerPlainParent = new ExecutorScheduler.ExecutorSchedulerWorker(plainExecutor); try { assertThat(Scannable.from(workerScannableParent).scan(Scannable.Attr.PARENT)) .as("workerScannableParent") .isSameAs(scannableExecutor); assertThat(Scannable.from(workerPlainParent).scan(Scannable.Attr.PARENT)) .as("workerPlainParent") .isNull(); } finally { workerPlainParent.dispose(); workerScannableParent.dispose(); } }
@Override public Worker createWorker() { return new ExecutorScheduler.ExecutorSchedulerWorker(this); }
@Override public Object scanUnsafe(Attr key) { if (key == Attr.TERMINATED || key == Attr.CANCELLED) return isDisposed(); if (key == Attr.BUFFERED) return tasks.size(); if (key == Attr.PARENT) return (executor instanceof Scannable) ? executor : null; if (key == Attr.NAME) { //hack to recognize the SingleWorker if (executor instanceof SingleWorkerScheduler) return executor + ".worker"; return Schedulers.FROM_EXECUTOR + "(" + executor + ").worker"; } return Schedulers.scanExecutor(executor, key); } }
@Override public Worker createWorker() { return trampoline ? new ExecutorSchedulerTrampolineWorker(executor) : new ExecutorSchedulerWorker(executor); }