簡體   English   中英

我可以創建任意多個線程嗎?

[英]Can I create as many thread as I want?

我正在開發一種REST Web服務,該服務應該從客戶端接收文件並對其進行處理。 之后,我收到文件,我想創建一個新線程來處理文件,因此我沒有義務等待處理功能的結束。

如果我收到很多文件,我將創建很多線程。 有任何限制或危險嗎?

如果我收到很多文件,我將創建很多線程。 有任何限制或危險嗎?

就在這里。 我不確定線程​​數是否有限制,但是在某些時候您耗盡內存。 每個線程都有堆棧和其他將累加的本地存儲。

如果達到了限制,我將不接受新的連接來限制您分叉的線程數。 然后,其他連接將在TCP隊列中等待,直到之前的請求完成。

更好的機制可能是使用固定的ExecutorService線程池,而不是為每個請求派生新線程:

// create a thread pool with 10 workers
ExecutorService threadPool = Executors.newFixedThreadPool(10);
while(!shutdown) {
   // receive a request from your service -- this is tricky
   // process it using the thread pool
   threadPool.submit(new MyRequest(...));
}
...
// once we have submitted all jobs to the thread pool, it should be shutdown
threadPool.shutdown();

棘手的部分是如何確定哪些連接可讀。 這需要NIO代碼,通道選擇器等來復用連接,您必須查看可以讀取的連接。

當您從客戶端收到文件時,將自動在新線程中對其進行處理。 線程的數量受兩件事限制:1.應用程序服務器配置(例如,默認情況下,Jboss或Tomcat可以同時處理100個線程); 2.有時WS提供程序似乎包含線程隊列。 例如,默認情況下,CXF不允許同時處理10個線程(以防您不更改此配置)。

最好的方法是使用線程池 ,該線程池將在線程創建方面(它們將被預先創建)提供更好的性能,並提供更好的資源管理,以免造成系統超載和內存不足。

理論上,您可以創建與計算機可以處理的線程一樣多的線程。 線程數量沒有限制,但是如果您打開的線程數超過1000,則計算機的運行速度將會降低。

抱歉,您的問題表明您正在嘗試重新發明輪子。

首先,人們在創建服務器時傾向於使用線程池。 這樣可以防止其應用程序創建額外的線程以提高性能。 其次,所有現代服務器都使用NIO,並且不會按請求創建線程。 第三,也是最后一個:為什么要開發已經開發的東西? 有很多完善的Java Web服務器都支持標准API。 有很多REST框架。 即使是最有才華的程序員,也沒有機會開發在合理時間內比現有服務器性能更好的Web服務器。

最后一點與您執行作業無關。

使用線程池...

private static final int THREAD_COUNT = 10;

    private static final ThreadPoolExecutor pool = new ThreadPoolExecutor(
                THREAD_COUNT, THREAD_COUNT, 10, TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>());
    public static void submitAgentToPool(Runnable thread) {
        try {
            if(thread != null) {
            LOG.info("ActiveThreads :" + pool.getActiveCount());
            pool.execute(thread);
            }
        catch (Exception e) {
            LOG.error("Exception while Starting thread: " + e.getMessage(), e);
        }
    }

繼續將線程添加到該池中...將確保瞬間僅運行10個線程

暫無
暫無

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

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