Спасибо всем за ваш вклад и помощь. Теперь я запускаю функцию непосредственно на элементе, как вы все предложили.
Однако я обнаружил проблему. Как я дурачок ?? У меня была ссылка на мой файл .js дважды в моем HTML-файле макета. Duuh for me !!
Еще раз спасибо всем, что нашли время помочь мне!
Best !!
Обычно на ExecutorService
вы вызываете shutdown ()
, а затем awaitTermination ()
:
ExecutorService taskExecutor = Executors.newFixedThreadPool(4);
while(...) {
taskExecutor.execute(new MyTask());
}
taskExecutor.shutdown();
try {
taskExecutor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
...
}
если Вы используете больше потока ExecutionServices ПОСЛЕДОВАТЕЛЬНО и хотите ожидать КАЖДЫЙ EXECUTIONSERVICE, который будет закончен. Лучший способ похож ниже;
ExecutorService executer1 = Executors.newFixedThreadPool(THREAD_SIZE1);
for (<loop>) {
executer1.execute(new Runnable() {
@Override
public void run() {
...
}
});
}
executer1.shutdown();
try{
executer1.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
ExecutorService executer2 = Executors.newFixedThreadPool(THREAD_SIZE2);
for (true) {
executer2.execute(new Runnable() {
@Override
public void run() {
...
}
});
}
executer2.shutdown();
} catch (Exception e){
...
}
Используйте CountDownLatch :
CountDownLatch latch = new CountDownLatch(totalNumberOfTasks);
ExecutorService taskExecutor = Executors.newFixedThreadPool(4);
while(...) {
taskExecutor.execute(new MyTask());
}
try {
latch.await();
} catch (InterruptedException E) {
// handle
}
и в своей задаче (заключите в try / finally)
latch.countDown();
Вы можете обернуть свои задачи в другом исполняемом файле, который будет отправлять уведомления:
taskExecutor.execute(new Runnable() {
public void run() {
taskStartedNotification();
new MyTask().run();
taskFinishedNotification();
}
});
Класс CyclicBarrier в Java 5 и более поздних версиях предназначен для такого рода вещей.
ExecutorService.invokeAll ()
сделает это за вас.
ExecutorService taskExecutor = Executors.newFixedThreadPool(4);
List<Callable<?>> tasks; // your tasks
// invokeAll() returns when all tasks are complete
List<Future<?>> futures = taskExecutor.invokeAll(tasks);
Вы можете использовать свой собственный подкласс ExecutorCompletionService , чтобы обернуть taskExecutor
,