Как я могу создать новую тему, только если в данный момент нет открытых тем?

Этот код создает и запускает поток:

new Thread() {
    @Override
    public void run() {
        try { player.play(); }
        catch ( Exception e ) { System.out.println(e); }
    }
}.start();

Я хотел бы изменить этот код так, чтобы поток запускался только в том случае, если в это время не было открыто никаких других потоков! Если есть, я хотел бы закрыть их и начать этот.

Ответы

Ответ 1

Вы можете создать ExecutorService, который разрешает только один поток с помощью метода Executors.newSingleThreadExecutor. После того как вы получите исполнитель одиночного потока, вы можете вызвать execute с параметром Runnable:

Executor executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() { public void run() { /* do something */ } });

Ответ 2

Моим предпочтительным методом было бы поставить синхронизированное ключевое слово в методе воспроизведения

synchronized play()

синхронизированные методы блокируют функцию, поэтому только одному потоку будет разрешено выполнять их за раз.

Вот еще информация https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

Ответ 3

вы можете создать статический член данных для класса (где выполняется потоковая передача), который увеличивается каждый раз, когда вызывается объект этого класса, читайте, что и вы получаете количество запущенных потоков