2014-11-16 26 views
3

我正在用套接字在Java上構建客戶端 - 服務器應用程序。據我所知,爲每個連接的客戶端創建一個線程太昂貴了。相反,我們可以使用ThreadPool Executor。正如在併發documentation中所說的,我們可以創建一個固定大小的線程池。ThreadPool執行程序和大量客戶端同時連接

class NetworkService implements Runnable { 
    private final ServerSocket serverSocket; 
    private final ExecutorService pool; 

    public NetworkService(int port, int poolSize) 
     throws IOException { 
    serverSocket = new ServerSocket(port); 
    pool = Executors.newFixedThreadPool(poolSize); 
    } 

    public void run() { // run the service 
    try { 
     for (;;) { 
     pool.execute(new Handler(serverSocket.accept())); 
     } 
    } catch (IOException ex) { 
     pool.shutdown(); 
    } 
    } 
} 

而且看起來我們最多隻有poolSize線程在每個時間點運行。但是如果我們需要維護大於poolSize的連接數量呢?它是如何工作的?

+0

它不會。您的客戶將阻塞,直到線程可用。 – atamanroman

+0

增加'poolSize'? –

+0

@ScottHunter我需要保持1000個客戶端同時連接。這是否意味着我將不得不創建1000個線程? –

回答

3

如果你要真有巨大量的客戶,你應該考慮NIO它,因爲每個客戶端創建線程會太貴。

NIO使用選擇器和通道,不需要爲每個連接創建新的線程。見image

您是否聽說過netty?我不知道你要實施什麼,但似乎它會有用。

+0

您的意思是使用低級別OS API創建線程? –

+0

回答一下編輯。 – Maksym

+0

啊,好吧......我明白了......或多或少) –