Вот моя задача. У меня статическая очередь заданий в классе и статический метод, который добавляет задания в очередь. Имейте n количество потоков, опрошенных в очереди и выполняющих задание. Мне нужно провести опрос n потоков одновременно с интервалом. AKA, все 3 должны опросить каждые 5 секунд и искать работу.Исполнитель и графикWithFixedDelay()
У меня есть это:
public class Handler {
private static final Queue<Job> queue = new LinkedList<>();
public static void initialize(int maxThreads) { // maxThreads == 3
ScheduledExecutorService executorService =
Executors.newScheduledThreadPool(maxThreads);
executorService.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
Job job = null;
synchronized(queue) {
if(queue.size() > 0) {
job = queue.poll();
}
}
if(job != null) {
Log.log("start job");
doJob(job);
Log.log("end job");
}
}
}, 15, 5, TimeUnit.SECONDS);
}
}
Я получаю этот вывод, когда я добавляю 4 задачи:
startjob
endjob
startjob
endjob
startjob
endjob
startjob
endjob
Очевидно, что эти нити выполняют, что задания последовательно, в то время как мне нужно их сделать 3 за раз. Что я делаю не так? Благодаря!
Действительно ли требуется опрос, или это просто деталь реализации, чтобы получить задания из вашей очереди в пул потоков? – Floegipoky
Просто подсказка, но, вероятно, лучше отправить задачу с помощью 'Job' вместо синхронизации/опроса в Runnable on' queue'; этот вид побеждает цель параллельного выполнения. – raffian