Java динамический пул потоков - PullRequest
1 голос
/ 20 июня 2019

Я хотел бы написать Thread-Pool на Java, который автоматически изменяет размер своих рабочих.Без динамического изменения размера это довольно просто, как вы можете видеть в примере ниже.

По моему мнению, я должен проверять, нужно ли мне добавлять работника, когда задача ставится в очередь.И каждый раз, когда работник заканчивает свою работу, он должен проверять, есть ли больше работников, чем нужно.

public class ThreadPool {

private static final int WORKER_THREADS = 5;
private static final int MIN_WORKER_THREADS = 2;

private List<Thread> worker;
private LinkedList<ThreadTask> queue;


public ThreadPool() {
    this.worker = new ArrayList<Thread>();
    this.queue = new LinkedList<ThreadTask>();

    for (int i = 0; i < WORKER_THREADS; i++) {
        addThread();
    }
}

private void addThread() {
    WorkerThread thread = new WorkerThread();
    thread.start();
    this.worker.add(thread);
}

public void enque(ThreadTask task) {
    synchronized (queue) {
        queue.add(task);

        // ADD WORKER HERE 

        queue.notify();
    }
}

private class WorkerThread extends Thread {

    @Override
    public void run() {
        while (true) {
            ThreadTask task;
            synchronized (queue) {
                while (queue.isEmpty()) {
                    try {
                        queue.wait();
                    } catch (InterruptedException e) {

                    }
                }
                task = queue.poll();
            }
            try {
                task.run();
                // REMOVE WORKER HERE
            } catch (RuntimeException rte) {

            }
        }
    }
}

Но, честно говоря, я не уверен, что и как синхронизировать.Моим первым предположением было синхронизировать список workerThreads, но на самом деле это не сработало.

Пожалуйста, не спрашивайте, почему я хочу написать собственный ThreadPool - только для учебных и демонстрационных целей.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...