簡體   English   中英

難以理解Java線程

[英]Trouble understanding Java threads

抱歉,我從python了解了多處理的知識,在理解Java的方法時遇到了一些麻煩。 在python中,我可以說我想要一個由4個進程組成的池,然后向我的程序發送一堆工作,並且它一次可以處理4個項目。 我意識到,使用Java,我需要使用線程來完成相同的任務,到目前為止,它似乎真的工作得很好。

但是..我與python不同,我的cpu沒有獲得100%的利用率(它們大約為70-80%),並且我懷疑它是我創建線程的方式(python / java和程序是獨立的)。 在Java中,我不確定如何創建一個線程,因此我要為要處理的列表中的每個項目創建一個線程,如下所示:

    for (int i = 0; i < 500; i++) {
        Runnable task = new MyRunnable(10000000L + i);
        Thread worker = new Thread(task);
        // We can set the name of the thread
        worker.setName(String.valueOf(i));
        // Start the thread, never call method run() direct
        worker.start();
        // Remember the thread for later usage
        threads.add(worker);
    }

我從這里拿走的。 我的問題是這是啟動線程的正確方法,還是有辦法讓java本身來管理線程數,使其達到最佳狀態? 我和我猜想的每個人一樣,我希望我的代碼盡可能快地運行,並且我試圖理解如何分辨和解決可能由於創建過多線程而引起的任何問題。 這不是主要問題,只是對它在Java引擎下的工作方式感到好奇。

謝謝!

您使用Executor ,其實現處理一個線程池,確定線程數,依此類推。 有關許多示例,請參見Java教程

通常,除了非常簡單的東西外,Java中不使用裸線程。 相反,會有一些更高級別的API接收您的Runnable或Task並知道該怎么做。

看一下Java Executor API。 例如,請參閱本文

盡管創建線程比以前要便宜得多,但是創建大量線程(如示例中的每個可運行線程)並不是可行的方法-創建它們仍然會產生開銷,並且最終上下文切換過多。

Executor API允許您創建各種類型的線程池來執行Runnable任務,因此您可以重用線程,靈活地管理所創建的線程數,並避免每個可運行線程的開銷。

順便說一下,Java線程模型和Python 線程模型(不是多處理)確實非常相似。 沒有像Python那樣的Global Interpreter Lock,因此通常較少需要派生多個進程。

線程是“低級” API。

根據您要執行的操作以及所使用的Java版本,它們是更好的解決方案。 如果您使用Java 7,並且如果您的任務允許,則可以使用fork / join框架: http : //docs.oracle.com/javase/tutorial/essential/concurrency/forkjoin.html

但是,請看一下Java並發教程: http : //docs.oracle.com/javase/tutorial/essential/concurrency/executors.html

暫無
暫無

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

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