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