Потоки: как отслеживать создание и завершение?

May 30, 2008 12:57

Есть простой веб-краулер, который рекурсивно обходит все ссылки с некоторой страницы ( Read more... )

threads

Leave a comment

Comments 6

jdevelop May 30 2008, 09:36:17 UTC
мы подобную проблему решали через специательный класс, в котором при старте потоки регистрируются, при окончании - удаляются, и спецметод waitForAll(), который синхронизированно ждет на внутреннем мьютексе до тех пор, пока коллекция ссылок на потоки не будет пустой, по удалению потока из коллекции происходит notify мьютекса, происходит итерация цикла внутри waitForAll() и если потоков нет - то происходит notifyAll и выход из цикла

работает уже почти четыре года, жалоб нет, вероятно есть стандартные решения - мы не искали

Reply


c8ne May 30 2008, 09:38:27 UTC
Почему бы не воспользоваться уже готовым велосипедом:

Заодно и побыстрее будет.

Reply

c8ne May 30 2008, 10:12:40 UTC
Ошибся с методом # awaitTermination(long,%20java.util.concurrent.TimeUnit).

Вариант ниже работает.

import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Semaphore;
import java.util.concurrent.ThreadFactory;

public class ThreadDemo {
static ExecutorService service = Executors.newCachedThreadPool(new ThreadFactory(){
public Thread newThread(Runnable r) {
Thread rc = new Thread(r);
rc.setDaemon(true);
return rc;
}
});
static MySemaphore sem = new MySemaphore(0);

static int c = 5;

private static final int MAIN_THREAD_SLEEP = 100;
private static final int WORKER_THREAD_SLEEP = 1;

private static void doSmth(final String url) {
try {
if (--c == 0) return;
System.out.print(" sem.reducePermits(1 ( ... )

Reply

zlobniyanonim May 30 2008, 11:23:49 UTC
можно добавить использование Future, которые можно спрашивать насчет завершенности и получать результат работы.
а пул экзекьюторов будет их брать из какой-нибудь очереди выполнять постепенно.

Reply


sunbeam_ May 30 2008, 09:52:33 UTC
+1 за Executor'ы

Reply


the_very May 30 2008, 10:37:51 UTC
круто, всем спасибо, сейчас буду пробовать!

Reply


Leave a comment

Up