Servlet线程调度

问题描述 投票:0回答:1
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);
                    }
    }

我已经在过滤器中完成了上面的代码,以限制访问servlet的用户数量(即,其登录后出现的主页

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();
            }
   }
}

它显示首页对前2个用户的响应。我将随后的请求(3,4,5)存储在队列中,并检查了先前的主线程(1或2)是否已完成其睡眠状态,如果这样做了,那么我将删除唤醒的线程并弹出第三线程(即)从队列开始,让它执行向第三用户显示主页的工作(即)并进入睡眠状态。现在按照我的摩托车,这是我所期望的。

第一用户登录。

第二个用户登录10秒后。

[10秒后,第三个用户登录,他必须处于等待阶段。

10秒后,第四个用户登录,他必须处于等待阶段。

[第50位第二位用户必须获得答复。(即)第一位用户完成工作。

在第60位第二个用户时,第4个用户必须获得答复。(即)第2个用户完成工作。

但是现在问题出在第三和第四位用户都在第50秒处得到响应。

任何帮助都会非常有用。谢谢。

public class Authenticate实现Filter {静态列表homethread = new ArrayList ();静态队列threadQueue = new LinkedList ();公共无效...

java multithreading servlets
1个回答
0
投票

将逻辑放在一边,您需要使用线程安全的集合来存储线程,而不是简单的列表。而且,您可以达到限制线程数的相同结果,即可以使用Semaphore和预定义的许可数量来调用过滤器。

© www.soinside.com 2019 - 2024. All rights reserved.