Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Остановить функцию до завершения всех потоков...


Автор: spruce 18.1.2012, 16:01
Добрый день.

Подскажите, пожалуйста, как можно остановить выполнение функции, пока не закончится выполнение потоков распараллеленной функции?

У меня одна мысль - это использовать флаги. Но может есть какое-то встроенное средство в 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)");
    }
}



Автор: jk1 18.1.2012, 20:16
http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/CountDownLatch.html должен подойти.

Автор: spruce 19.1.2012, 09:35
Да, то что нужно, спасибо smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)