我編程在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
你需要實現線程的「池」(意識到這有多難,也許),或者是你允許使用一些圖書館這樣做呢? –