Используйте Исполнителей, как рекомендовано другими. Однако, если вы хотите получить удовольствие от этого, попробуйте что-то вроде этого. (Будьте осторожны. Я написал это в Блокноте, и есть некоторые исключения, которые вам нужно будет отследить, даже если я все правильно понял. Блокнот плохо распознает ошибки кодирования.) Это скорее концепция, чем реальное решение чего-либо, но идея может быть в целом полезным.
private ConcurrentLinkedQueue<MyThread> tQueue =
new ConcurrentLinkedQueue<MyThread>();
class MyThread extends Thread {
public Runnable doSomething;
public void run() {
// Do the real work.
doSomething();
// Clean up and make MyThread available again.
tQueue.add( mythread );
// Might be able to avoid this synch with clever code.
// (Don't synch if you know no one's waiting.)
// (But do that later. Much later.)
synchronized (tQueue) {
// Tell them the queue is no longer empty.
tQueue.notifyAll();
}
}
}
В другом месте:
// Put ten MyThreads in tQueue.
for (int i = 0; i < 10; i++) tQueue.add( new MyThread() );
// Main Loop. Runs ten threads endlessly.
for (;;) {
MyThread t = tQueue.poll();
if (t == null) {
// Queue empty. Sleep till someone tells us it's not.
do {
// There's a try-catch combo missing here.
synchonized( tQueue ) { tQueue.wait() };
t = tQueue.poll();
} while (t == null) break; // Watch for fake alert!
}
t.doSomething = do_some_work;
t.start();
}
Также обратите внимание на умное использование ConcurrentLinkedQueue. Вы можете использовать что-то еще, например, ArrayList или LinkedList, но вам нужно их синхронизировать.