Я разрабатываю пул потоков в Java для ежевики, это код, который я в настоящее время:Blackberry пул потоков не работает хорошо
public class ThreadPool {
int maxWorkers = 15;
Vector queue = new Vector();
Thread[] workers;
public ThreadPool(int maxThreads) {
if (maxThreads <= maxWorkers)
maxWorkers = maxThreads;
workers = new Thread[maxThreads];
for (int i = 0; i < maxThreads; i++) {
// Crea un worker que ejecuta trabajos.
workers[i] = new Thread(new Runnable() {
public void run() {
Runnable r;
while (true) {
synchronized (queue) {
while (queue.size() == 0) {
try {
queue.wait();
} catch (Exception e) {
System.out.println("Error while waiting");
}
}
try {
r = (Runnable) queue.firstElement();
queue.removeElement(r);
r.run();
queue.notify();
} catch (Throwable e) {
System.out.println("nope!");
}
}
}
}
});
workers[i].start();
}
}
public void addWork(Runnable work) {
synchronized (queue) {
queue.addElement(work);
queue.notify();
}
}
}
Проблема в том, что если я очередь 10 рабочих мест, они будут выполнять один после того, как другой, а не в совместительству, как, например:
for (int i=0; i<10; i++) {
pool.addWork(new Runnable() {
public void run() {
Random random = new Random();
int time = random.nextInt(5) * 1000;
System.out.println("I'm work " + i);
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
И я получаю:
I'm work 1
I'm work 2
I'm work 3
...
'r.run()' не выполняется внутри Thread. –
Спасибо человеку !!! Ты восхитителен!!! –
Уже пробовал ответить @sroj, и он отлично работал, помните, что «r» - это исполняемый объект, его метод запуска действительно можно вызвать внутри потока. –