У меня есть пул потоков с 10 потоками. Я хочу, чтобы эти 10 потоков продолжали работать, чтобы отслеживать, ожидают ли новые запросы. Это хороший дизайн? Если да, как я могу заставить их продолжать работать? Потому что прямо сейчас они сделали работу один раз, а потом заканчивают. Если нет, то какой дизайн лучше? В любом случае у нас есть один поток, который продолжает выполнять свою работу, а второй работает, когда еще один запрос становится ожидающим? Спасибо

3
Laodao 28 Май 2017 в 08:40

2 ответа

Лучший ответ

Это хороший дизайн?

В основном нет.

Это никогда не является хорошим дизайном для переопределения функциональности, которая обеспечивается классами в стандартной библиотеке классов Java SE.

В этом случае вы должны использовать реализацию ExecutorService с ограниченным пулом потоков. Также может быть целесообразно использовать ограниченную рабочую очередь, чтобы избежать проблем, если частота запросов может превысить возможности вашей системы их обрабатывать.

(Если ваша очередь запросов не ограничена или граница слишком велика, вы можете столкнуться с такими проблемами, как тайм-аут запроса, прежде чем ваша система начнет обрабатывать запрос. Если ваша система не может обнаружить это, то она впустую ресурсы для обработки запросов, ответы которых не будут использоваться. Рекомендуется ограниченная очередь с относительно небольшой границей ... или даже SynchronousQueue ..., если вам нужно изящно справиться с перегрузкой.)

0
Stephen C 28 Май 2017 в 06:59

Потоки run () должны выполняться в цикле, примерно так:

class Executor extends Thread {
    Runnable task;

    public void run() {
        for (;;) {
            task.run();
            synchronized (this) {
                try {
                    wait();
                } catch (InterruptedException e) {
                }
            }
        }
    }

Версия на основе очереди:

public void run() {
    for (;;) {
        try {
            Runnable task = queue.take();
            task.run();
        } catch (InterruptedException e) {
        }
    }
}
2
Evgeniy Dorofeev 28 Май 2017 в 06:44