Я хотел бы написать 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 - только для учебных и демонстрационных целей.
Спасибо.