2016-03-01 28 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。重用这些工具而不是重新实现它总是更好。

相关问题