Этот код создает и запускает поток:
new Thread() {
@Override
public void run() {
try { player.play(); }
catch ( Exception e ) { System.out.println(e); }
}
}.start();
Я хотел бы изменить этот код так, чтобы поток только запустился, при отсутствии других потоков, открытых в то время! Если существуют, я хотел бы закрыть их и запустить этого.
Вы можете создать ExecutorService
. После того, как вы получите один исполнитель поток, вы можете позвонить Execute
с Runnable Praynable
:
Executor executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable() { public void run() { /* do something */ } });
Если вы написали выше без лямбд, как это было бы?
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 получите количество запущенных потоков