мы подобную проблему решали через специательный класс, в котором при старте потоки регистрируются, при окончании - удаляются, и спецметод waitForAll(), который синхронизированно ждет на внутреннем мьютексе до тех пор, пока коллекция ссылок на потоки не будет пустой, по удалению потока из коллекции происходит notify мьютекса, происходит итерация цикла внутри waitForAll() и если потоков нет - то происходит notifyAll и выход из цикла
работает уже почти четыре года, жалоб нет, вероятно есть стандартные решения - мы не искали
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;
можно добавить использование Future, которые можно спрашивать насчет завершенности и получать результат работы. а пул экзекьюторов будет их брать из какой-нибудь очереди выполнять постепенно.
Comments 6
работает уже почти четыре года, жалоб нет, вероятно есть стандартные решения - мы не искали
Reply
Заодно и побыстрее будет.
Reply
Вариант ниже работает.
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
а пул экзекьюторов будет их брать из какой-нибудь очереди выполнять постепенно.
Reply
Reply
Reply
Leave a comment