001 package railo.runtime.engine; 002 003 import java.io.IOException; 004 import java.util.ArrayList; 005 import java.util.List; 006 007 import railo.commons.io.SystemUtil; 008 import railo.commons.lang.SerializableObject; 009 import railo.runtime.PageContext; 010 011 public class ThreadQueueImpl implements ThreadQueue { 012 private final SerializableObject token=new SerializableObject(); 013 014 015 public final List<PageContext> list=new ArrayList<PageContext>(); 016 private final int max; 017 private long timeout; 018 019 public ThreadQueueImpl(int max, long timeout){ 020 this.max=max; 021 this.timeout=timeout; 022 } 023 024 025 public void enter(PageContext pc) throws IOException { 026 //print.e("enter("+Thread.currentThread().getName()+"):"+list.size()); 027 long start=System.currentTimeMillis(); 028 while(true) { 029 synchronized (token) { 030 if(list.size()<max) { 031 //print.e("- ok("+Thread.currentThread().getName()+"):"+list.size()); 032 list.add(pc); 033 return; 034 } 035 } 036 if(timeout>0) SystemUtil.wait(token,timeout); 037 else SystemUtil.wait(token); 038 039 if(timeout>0 && (System.currentTimeMillis()-start)>=timeout) 040 throw new IOException("timeout ("+(System.currentTimeMillis()-start)+") ["+timeout+"] is occured, server is busy handling requests"); 041 } 042 } 043 044 public void exit(PageContext pc){ 045 //print.e("exist("+Thread.currentThread().getName()+")"); 046 synchronized (token) { 047 list.remove(pc); 048 token.notify(); 049 } 050 } 051 052 public int size(){ 053 return list.size(); 054 } 055 056 057 public void clear() { 058 list.clear(); 059 token.notifyAll(); 060 } 061 062 063 /*public static class Test extends Thread { 064 private ThreadQueueImpl queue; 065 public Test(ThreadQueueImpl queue){ 066 this.queue=queue; 067 } 068 public void run(){ 069 String name = Thread.currentThread().getName(); 070 try { 071 queue.enter(name); 072 queue.size(); 073 SystemUtil.sleep(50); 074 queue.exit(name); 075 } 076 catch (IOException e) { 077 e.printStackTrace(); 078 } 079 080 081 } 082 } 083 084 public static void main(String[] args) { 085 ThreadQueueImpl queue=new ThreadQueueImpl(4,1000); 086 new Test(queue).start(); 087 new Test(queue).start(); 088 new Test(queue).start(); 089 new Test(queue).start(); 090 new Test(queue).start(); 091 new Test(queue).start(); 092 new Test(queue).start(); 093 new Test(queue).start(); 094 new Test(queue).start(); 095 new Test(queue).start(); 096 new Test(queue).start(); 097 new Test(queue).start(); 098 new Test(queue).start(); 099 new Test(queue).start(); 100 new Test(queue).start(); 101 new Test(queue).start(); 102 new Test(queue).start(); 103 new Test(queue).start(); 104 new Test(queue).start(); 105 new Test(queue).start(); 106 new Test(queue).start(); 107 new Test(queue).start(); 108 new Test(queue).start(); 109 new Test(queue).start(); 110 new Test(queue).start(); 111 new Test(queue).start(); 112 new Test(queue).start(); 113 new Test(queue).start(); 114 new Test(queue).start(); 115 new Test(queue).start(); 116 new Test(queue).start(); 117 new Test(queue).start(); 118 new Test(queue).start(); 119 new Test(queue).start(); 120 new Test(queue).start(); 121 122 123 }*/ 124 125 126 }