Только одна нить за раз!
Вот мой код:
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
Вы можете создать статический член данных для класса (где происходит многопоточность), который увеличивается каждый раз при вызове объекта этого класса, читаете его, и вы получаете количество запущенных потоков.