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

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

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

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

15
задан divibisan 4 April 2019 в 20:32
поделиться

2 ответа

Вы можете создать ExecutorService

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

Executor executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() { public void run() { /* do something */ } });
37
ответ дан 1 December 2019 в 01:30
поделиться

Если вы написали выше без лямбд, как это было бы?

backgroundWorker1.DoWork += 
                new DoWorkEventHandler(backgroundWorker1_DoWork);

и именованный метод:

private void backgroundWorker1_DoWork(object sender, 
        DoWorkEventArgs e)
    {   
        // Get the BackgroundWorker that raised this event.
        BackgroundWorker worker = sender as BackgroundWorker;

        // Assign the result of the computation
        // to the Result property of the DoWorkEventArgs
        // object. This is will be available to the 
        // RunWorkerCompleted eventhandler.
        e.Result = ComputeFibonacci((int)e.Argument, worker, e);
    }

Но теперь вы используете лямбды без связанных переменных () = > Вы должны предоставить два объекта sender и e (которые будут выведены позже).

backgroundWorker1.DoWork += (sender, e) => ...
-121--1433919-

Можно создать службу ExecutingService , разрешающую только один поток с помощью метода Executors.newSingleThreadExecutor . Как только вы получите исполнитель одного потока, вы можете вызвать execute с параметром Runnable :

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

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

-6
ответ дан 1 December 2019 в 01:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: