簡體   English   中英

Java ThreadPool用於多個相同的任務

[英]Java ThreadPool for multiple identical tasks

我有1個線程的唯一工作是從套接字中獲取DatagramPackets並將其粘貼在緩沖區中。 另一個線程在該緩沖區中工作,處理DatagramPackets。 我想要一個在該緩沖區外工作的線程池。

我曾考慮過使用固定線程池來執行此操作。 為此,我是否需要創建池,然后提交足夠的可運行對象以供執行以將其填滿? 我希望有一種方式可以說:“這是我要您執行的線程/可運行程序,這是我要運行的線程數,GO!”。 有這種方法嗎? 除了固定線程池之外,還有其他更合適的方法嗎?

Executors.newFixedThreadPool創建的固定線程池可以正常工作。

實現的內部語義是這樣的:線程池將優先選擇創建新線程,直到達到所需的大小(核心池大小)為止,這似乎是您想要的。

當您使用ExecutorService提交Runnable作業被依次由池中的線程運行一個線程池。 您可以執行以下操作之一:

  1. 讓每個Runnable處於一個循環中,在循環中從BlockingQueue出隊以處理每個數據包。 這可能比所有它們都圍繞您的緩沖區對象同步要容易。 就像是:

     public void run() { while (!shutdown) { packet = packetQueue.take(); processPacket(packet); } } 
  2. 另外,您可以將每個數據包作為作業本身提交到線程池,盡管這可能會增加對象負載。 你可以處理每個數據包,提取出有效載荷,並創建一個Runnable圍繞有效載荷封裝器與run()其處理所述有效載荷的方法。 Runnable類的內容如下所示:

     Payload payload; public void run() { // process packet here processPayload(payload); } 

通過這兩種機制,我將選擇一個最適合您的處理器數量和處理任務性質的固定線程號。 下面的示例使用了多個處理器,但您可能希望將其用於GC或其他任務。 如果其他IO上的處理阻塞,則可能需要添加更多內容。 只有性能測試才能告訴您最佳值是多少。

// start a pool that uses the number of threads that there are processors
ExecutorService threadPool = Executors.newFixedThreadPool(
    Runtime.getRuntime().availableProcessors());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM