RecordingWorker.java

package org.hammer.audio;

import java.util.Objects;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/** Owns the dedicated recorder thread and its completion signal. */
final class RecordingWorker {

  private final ExecutorService executor;
  private final CountDownLatch completed = new CountDownLatch(1);

  RecordingWorker(String threadName) {
    Objects.requireNonNull(threadName, "threadName");
    executor =
        Executors.newSingleThreadExecutor(
            runnable -> {
              Thread thread = new Thread(runnable, threadName);
              thread.setDaemon(true);
              return thread;
            });
  }

  void start(Runnable task) {
    executor.execute(Objects.requireNonNull(task, "task"));
  }

  void complete() {
    completed.countDown();
    executor.shutdown();
  }

  boolean await(long timeout, TimeUnit unit) throws InterruptedException {
    return completed.await(timeout, unit);
  }

  void cancel() {
    executor.shutdownNow();
  }
}