2011-12-11 39 views
2

對於持續的任務,例如渲染一個動畫,會在每一幀創建短暫線程比在開始時創建線程慢很多,然後暫停它們並恢復?在Java中創建線程可能是瓶頸嗎?

或者差異可以忽略不計?

+0

我不知道這是否是語言問題,但不可能說它是否會成爲瓶頸。如果你的系統速度很慢,那麼可能無關緊要,如果它是一個非常快的系統(或者框架等),那麼這幾個選擇之間的最快選項可能仍然是一個瓶頸? – Nanne

回答

8

這會慢很多;線程有很大的開銷。

您可以使用線程池重新使用線程並避免開銷。
但是,它可能仍然不值得使用線程進行這樣的短期任務,因爲上下文切換的成本將超過收益。

衡量它!

+0

我想我的應用程序中的線程並不像我所建議的那樣短暫。 Profiler表明創建線程的時間接近0%,以確認我已經重寫了我的代碼以使用線程池 - 沒有任何區別。 – mrpyo

+0

@mrpyo:線程創建不會顯示在探查器中,因爲它發生在新線程的OS中(設置和分配棧等)。它仍然很昂貴。 (據我所知) – SLaks

1

創建一個新線程有很大的開銷。如果線程的活動很短,創建開銷甚至可能比實際執行時間更長。您將需要儘可能多地回收線程。我建議使用ExecutorService

0

由於創建開銷,創建新線程並不是最好的方法。您應至少使用線程池(請參閱Executor瞭解更多詳細信息),而不是創建新線程。

線程的生命週期也很重要。如果太短,由於上下文切換開銷,性能可能會更差。

另一個重要的一點是您擁有的CPU /內核的數量。作爲一般規則,如果您的任務是CPU密集型的,那麼您應該使用每個核心1-2個線程(我假設這是您的情況)。如果你的任務是I/O密集型的,你可以把這個數字稍微加一點(比如說3-5個)。