簡體   English   中英

使用CachedThreadPool進行多線程

[英]Multi-threading with CachedThreadPool

我有一個服務器-客戶端通信體系結構,其中有一個服務器和150個客戶端。服務器-客戶端通信是通過java NIO進行的,其中所有客戶端每10秒發送一些或其他數據。 以前,我們曾經將所有處理消息排隊,並在單個線程中處理所有這些消息,因為客戶端的數量越多,消息越多,服務器無法立即處理所有消息,並且依次處理數據存在延遲失利。 因此,我考慮過要實現CachecThreadPool來盡快處理任務,因此我選擇了CachedThreadPool而不是FixedThreadPool,因為這些任務壽命短且數量眾多,以下是該代碼。 從客戶端接收消息的線程在接收到消息后立即調用ProcessorClass.processData(message)

public class ProcessorClass{

private static final Logger LOGGER = Logger.getLogger(ProcessorClass.class);
static ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newCachedThreadPool();

public static void processData(StringBuffer message) {
    Runnable task = new Runnable() {
        @Override
        public void run() {
            try {
                LOGGER.info("Queue size:"+executor.getQueue().size());
                if (message != null){
                    processMessage(message);
                }
            }
            catch(Exception e) {
                LOGGER.error("Error happened in run() method" + e.getMessage());
            }

        }
    };
    executor.execute(task);
}
public static void processMessage(StringBuffer message){
    // all the processing of message such as DB operations goes here.
}
}

釋疑:

1.How CachedThreadPool stores the message in the queue because i haven't defined any explicitly.
2.Should i chose FixedThreadPool over this?
3.Should i make my processMessage() method synchronized?

歡迎所有建議和評論。

Executors.newCachedThreadPoolExecutors.newFixedThreadPool都具有相同的線程池實現,只是參數不同。 區別在於它們的線程最小值,最大值,線程終止時間和隊列類型。

FixedThreadPool您可以向執行程序服務提交任意數量的任務,但是最大線程數將保持在您指定的級別。 如果您明確希望增加線程數,那么這不是正確的選擇。

CachedThreadPool不會限制線程CachedThreadPool的線程數。 它可以增長MAX_VALUE個整數。

CachedThreadPool如何將消息存儲在隊列中,因為我沒有明確定義任何消息。

CachedThreadPool不會將您的消息存儲在隊列中。 getQueue獲取您提交到隊列的任務。

我應該選擇FixedThreadPool嗎?

CachedThreadPool更靈活,因為它將增加和減少線程數量。 問題是它可能增長太多並導致OOM。 FixedThreadPool不會增長或縮小,但是如果您知道自己在做什么,通常就足夠了。 提示:進行監視和配置以確定您需要多少線程。

我應該使我的processMessage()方法同步嗎?

在不知道該方法的實現細節的情況下,我們無法建議您是否需要對其進行同步。 該方法肯定需要是線程安全的,但是如果僅在該方法上添加synchronized ,我希望性能會比僅在1個線程上運行所有方法還要差。

暫無
暫無

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

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