2016-03-01 107 views
0

我編程在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和我不知道如何解決它。

能否請你幫我跟我的情況?

+0

https://commons.apache.org/proper/commons-pool/(例如) – 2016-03-01 19:47:34

+0

您需要在單個塊中增加計數器並進行最大值檢查。所以你的thread_counter應該被移動到調度程序線程中 - (順便說一下:這不是解決併發性和可靠性等各種問題的最佳解決方案。使用線程池可以優雅地解決大部分thinbgs,但我不知道多少要返工) – eckes

+1

你需要實現線程的「池」(意識到這有多難,也許),或者是你允許使用一些圖書館這樣做呢? –

回答

1

您在​​區塊外使用threads_counter,並且此字段不是易失性的:您無法保證讀取threads_counter的「真實」值。

但是,就像在評論/回答中說的那樣,您不應該創建自己的線程,而是使用ThreadPoolExecutorService。重用這些工具而不是重新實現它總是更好。