Только одна нить за раз!

Вот мой код:

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

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

3 ответа

Решение

Вы можете создать ExecutorService это позволяет только один поток с Executors.newSingleThreadExecutor метод. Как только вы получите однопоточный исполнитель, вы можете позвонить execute с Runnable параметр:

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

Мой предпочтительный метод - поместить синхронизированное ключевое слово в метод play.

synchronized play()

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

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

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

Другие вопросы по тегам