Планирование потока сервлетов - PullRequest
0 голосов
/ 11 февраля 2020
public class Authenticate implements Filter
{
static List<Thread> homethread = new ArrayList<Thread>();
static Queue<Thread> threadQueue = new LinkedList<Thread>();
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException 
    {
                if(homethread.size()>=2)
                    {
                     threadQueue.add(Thread.currentThread());
                      while(!threadQueue.isEmpty())
                            {
                        for(Thread th : homethread)
                                {
                                    if(th.getState()!=Thread.State.TIMED_WAITING)
                                    {
                                        homethread.remove(th);
                                        Thread thr = threadQueue.remove();
                                        homethread.add(thr);
                                        chain.doFilter(request, response);
                                    }
                                }
                             }
                    }
                 else
                    {
                            homethread.add(Thread.currentThread());
                            chain.doFilter(request, response);
                    }
    }

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

public class Home extends HttpServlet 
{
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        response.setContentType("text/html");
        PrintWriter writter = response.getWriter();
        writter.println
            (
                    "<!DOCTYPE html>" + 
                    "<html>" + 
                    "<body>" +  
                    "<h1 style=\"text-align:center;\">Provide Your Choice</h1>"+
                    "<form action=\"Upload\" method=\"POST\">" +//enctype=\"multipart/form-data\" 
                    "<div style=\"text-align:center\">Upload File     :<input type=\"file\" name=\"UploadedFile\" multiple/><input type=\"submit\" value=\"Upload\"><br><br>"+
                    "</form>" + 
                    "<div style=\"text-align:center\">View Files     :<input type=\"submit\" formaction=\"View\" formmethod=\"post\" value=\"View\"/><br><br>" + 
                    "<div style=\"text-align:center\"><input type=\"submit\" formaction=\"LogOut\" formmethod=\"post\" value=\"LogOut\"/>" + 
                            "</body>" + 
                            "</html>"
            );
            response.flushBuffer();
            try 
            {
                Thread.currentThread().sleep(50000);
            } 
            catch (InterruptedException e) 
            {
                e.printStackTrace();
            }
   }
}

Показывает ответ Home Страница первым 2 пользователям Отлично. Я сохранил последующие запросы (3,4,5) в очереди, и я проверил, закончил ли какой-либо из предыдущих homethreads (1 или 2) свое состояние сна. Если это так, то я удалю пробуждаемый поток и выскакиваю 3-й поток (т. е.) отправляйтесь из очереди и дайте ему выполнить работу (т. е.), показывая домашнюю страницу 3-му пользователю и спя. Теперь, согласно моему мото, это то, что я ожидал.

Первый пользователь входит в систему.

Через 10 секунд Второй пользователь входит в систему.

Через 10 секунд третий пользователь Вход в систему и он должен быть в стадии ожидания.

Через 10 секунд 4-й пользователь входит в систему, и он должен быть в стадии ожидания.

Во время 50-й секунды 3-й пользователь должен получить ответ. (т.е.) 1-й пользователь завершил свою работу.

Во время 60-й секунды 4-й пользователь должен получить ответ. (т.е.) 2-й пользователь завершил свою работу.

Но теперь Проблема здесь заключается в том, что как 3-й, так и 4-й пользователь сам получают ответ на 50-й секунде.

Любая помощь будет настолько полезной. Заранее спасибо.

1 Ответ

0 голосов
/ 14 февраля 2020

Оставляя свои логи c в стороне, вы должны использовать поточно-ориентированные коллекции для хранения потоков вместо простых списков. И вы можете достичь того же результата, ограничив число потоков, которые могут вызывать фильтр, используя Semaphore с заранее определенным количеством разрешений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...