Manage a pool of threads for clients
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class PoolServerBase extends Thread {
protected Socket socket;
static PoolServerBase head = null;
protected PoolServerBase next = null;
static protected boolean init(Class clobj, int threads) {
try {
for (int i = 0; i < threads; i++) {
PoolServerBase thread = (PoolServerBase) clobj.newInstance();
thread.next = head;
head = thread;
thread.start();
}
} catch (Exception e) {
return false;
}
return true;
}
static synchronized protected void addToList(PoolServerBase me) {
me.next = head;
head = me;
}
synchronized protected void waitForSignal() {
try {
wait();
} catch (InterruptedException e) {
}
}
public void run() {
while (true) {
waitForSignal();
doClientProcessing();
addToList(this);
}
}
synchronized protected void handleClient(Socket s) {
socket = s;
notify();
}
protected void doClientProcessing() {
try {
String s = "Server.";
s += "Thread: " + this.toString();
socket.getOutputStream().write(s.getBytes());
sleep(10000); // simulate processing
s = "Complete";
socket.getOutputStream().write(s.getBytes());
socket.close();
} catch (Exception e) {
System.out.println(e);
}
}
static synchronized protected boolean listEmpty() {
return head == null;
}
static protected void assignThread(Socket sock) {
PoolServerBase t = head;
head = head.next;
t.socket = sock;
synchronized (t) {
t.notify();
}
}
static public void startServer(int port) {
ServerSocket ssock;
Socket sock;
try {
ssock = new ServerSocket(port);
while (true) {
Socket esock = null;
try {
esock = ssock.accept();
while (listEmpty())
yield();
assignThread(esock);
} catch (Exception e) {
try {
esock.close();
} catch (Exception ec) {
}
}
}
} catch (IOException e) {
}
}
static public void main(String args[]) {
init(PoolServerBase.class, 3);
System.out.println("Starting server on port 808");
startServer(808);
}
}
Related examples in the same category