Как я могу инициализировать этот семафор - PullRequest
0 голосов
/ 02 июня 2011

Я задал этот вопрос о многопоточности в сервлете, и многие люди предлагают использовать статическую переменную.

Если я установил статическую переменную и мне нужно ее инициализировать. Например, общедоступные статические разрешения семафора;

Сначала я попытался инициализировать его в методе init () фильтра, связанного с сервлетом:

public void init(FilterConfig conf) throws ServletException {
        // TODO Auto-generated method stub
    try{
            limit = Integer.parseInt(conf.getInitParameter("filterLimit"));
            permits = new Semaphore(limit);
    }catch(Exception ex){
            conf.getServletContext().log("Fail to set the parameter : permits.");
            throw new ServletException(ex.getMessage());
    }   


}

Тогда я подумал, что при таком количестве потоков все потоки, выполняющие метод init (), будут инициализировать семафор, он не должен работать.

Затем я попытался использовать статический инициализатор:

static{
        try{
            limit = Integer.parseInt(conf.getInitParameter("filterLimit"));
            permits = new Semaphore(limit);
        }catch(Exception ex){
            conf.getServletContext().log("Fail to set the parameter : permits.");
            throw new ServletException(ex.getMessage());
        }

 }

Но я не могу использовать объект conf, так как он передается из метода init (). Я хочу получить предельное число из web.xml, вместо того, чтобы жестко его кодировать. Есть идеи, чтобы решить эту проблему?

Ответы [ 2 ]

4 голосов
/ 02 июня 2011

Тогда я подумал, что при таком количестве потоков каждый поток, выполняющий метод init (), инициализирует семафор, он не должен работать.

Я не понимаю.Ваш метод init () должен вызываться контейнером сервлетов только один раз.Как вы используете эти фильтры / сервлеты?Создан ли поток внутри сервлета или вне сервлета?

Если он создан внутри сервлета, то будет хорошо использовать переменную, созданную в методе init ().

1 голос
/ 02 июня 2011

Просто проверьте лимит на ноль перед инициализацией.

...