2010-01-16 4 views
15

Вот мой код:Только одна тема за раз!

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

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

+3

(кроме главного потока, я думаю;)) –

ответ

36

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

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

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

+0

Но тогда у него мог быть только один поток, запущенный сразу. – danben

+1

Это то, что он хочет, я думал, только 1 Thread этого типа работает в любой момент времени. –

-6

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

+1

это хорошая идея, но тогда как бы я закрыл другие потоки? я бы не обращал на них никакого упоминания –

2

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

synchronized play() 

синхронизированные методы зафиксирует FUNCT так что только один поток будет иметь возможность выполнять их одновременно.

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

Смежные вопросы