Добрый день.
Подскажите, пожалуйста, как можно остановить выполнение функции, пока не закончится выполнение потоков распараллеленной функции?
У меня одна мысль - это использовать флаги. Но может есть какое-то встроенное средство в Spring?
Пишу с использованием Spring 3 MVC, запускаю на Tomcat 7.
Многопоточная функция
| Код | package job;
import org.apache.log4j.Logger; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component;
@Component("asyncWorker") public class AsyncWorker implements Worker {
static Logger logger = Logger.getLogger(AsyncWorker.class);
@Async @Override public void work() { String threadName = Thread.currentThread().getName(); logger.debug(" " + threadName + " has began working."); try { logger.debug("working..."); Thread.sleep(1000); // simulates work } catch (InterruptedException e) { Thread.currentThread().interrupt(); } logger.debug(" " + threadName + " has completed work."); } }
|
Функция, запускающая потоки:
| Код | package poller;
import java.util.List; import java.util.Map;
import javax.annotation.Resource;
import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service;
import job.Worker;
@Service public class Poller { static Logger logger = Logger.getLogger(Poller.class); @Autowired @Qualifier("simpleWorker") private Worker simpleWorker; @Scheduled(cron="0 */5 * * * ?") public void doPoller(){ logger.debug("Scheduler(every 5 minute) Started"); for (int i=0;i<100;i++){ simpleWorker.work(); }
// ЗДЕСЬ НЕОБХОДИМО ОСТАНОВИТЬ ВЫПОЛНЕНИЕ ДО ТОГО МОМЕНТА // ПОКА ВСЕ ПОТОКИ work НЕ ЗАВЕРШАТЬСЯ // И ТОЛЬКО ПОСЛЕ ЭТОГО ПРОДОЛЖИТЬ ВЫПОЛНЕНИЕ .... .... .... logger.debug("End Schedule(every 5 minute)"); } }
|
|