我编程在Java SE的简单Web服务器,而无需使用任何API。它有一个GUI,您可以在其中启动/停止服务器并查看它使用的线程数。如何限制Java中的最大线程数?
一个从我们的老师要求的是,它必须支持多线程,可以在启动服务器之前控制最大线程数。
我有WebServer
类延伸Thread
它作为一个线程运行。它具有MAX_THREADS和thread_counter字段。
Web服务器:
public static final int MAX_THREADS = 5;
public static int threads_counter = 0;
public void run() {
while (isRunning) {
try {
Socket socket = _serverSocket.accept();
if (threads_counter >= MAX_THREADS) {
Thread.sleep(100);
System.out.println("OVERLOAD");
} else {
new Handler(socket, new File(rootDir)).start();
}
} catch (IOException ex) {
Logger.getLogger(WebServer.class.getName()).log(Level.SEVERE, null, ex);
} catch (InterruptedException ex) {
Logger.getLogger(WebServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
有Handler类,其也延伸Thread
。我想将Handler
s的数量限制为MAX_THREADS。
这里是处理程序的样子:
public void run() {
synchronized (WebServer.class) {
WebServer.threads_counter++;
}
this.setName("thread no. " +WebServer.threads_counter);
System.out.println(this.getName());
HandleRequest(_socket);
synchronized (WebServer.class) {
WebServer.threads_counter--;
}
}
这并不总是如预期,但是。有时,它开始比max_threads的更多Handler
S和我不知道如何解决它。
能否请你帮我跟我的情况?
https://commons.apache.org/proper/commons-pool/(例如) – 2016-03-01 19:47:34
您需要在单个块中增加计数器并进行最大值检查。所以你的thread_counter应该被移动到调度程序线程中 - (顺便说一下:这不是解决并发性和可靠性等各种问题的最佳解决方案。使用线程池可以优雅地解决大部分thinbgs,但我不知道多少要返工) – eckes
你需要实现线程的“池”(意识到这有多难,也许),或者是你允许使用一些图书馆这样做呢? –