Avoid thread groups
我會特別記錄這個Item,是由於我閱讀Java高併發編程詳解:多線程與架構設計時,有個章節專門在講ThreadGroup的功用;但我想起曾經在Effective Java中,看到不建議使用它,所以我重翻了Effective Java第二版與Java Threads第三版。我針對看到的內容做一下整理分享給大家。
作者認為ThreadGroup的API太弱,沒什麼實質用途,主要為以下幾點原因:
- ThreadGroup原始目的是用來隔離applet,用以限制Thread是否有能力存取其它Thread的狀態;但這並沒被履行過,且Applet已經被廢了。
- stop、suspend、resume被廢了。
- 在Java 1.5之前,只有ThreadGroup才有能力去處理Thread例外,但現在Thread本身就有。
- 要取得active的thread必須透過enumerate method,而且因為同步存取的關係,不保證正確性。
在Java Threads第三版中,針對ThreadGroup提到,使用它有兩個好處:
- 提供你對group中所有的thread便利地一次操作,不過現在會有用的應該只有interrupt。
- 控制thread狀態存取的安全性,就是Effective Java作者反對的那點。
然而第一點的好處,似乎使用executor的API就能做到了,所以..
話不能說死,如果以後我真的有使用或看到ThreadGroup使用方法,再分享給大家。
Reference:
- Effective Java, 2/e, Item 73。
- Java高併發編程詳解:多線程與架構設計, 汪文君
- Java Threads, 3/e
Don’t depend on the thread scheduler
這個Item重點就是要你不要相信thread scheduler可以幫你解決thread排班問題,把code寫好比較實在。有幾個重點要注意:
- Thread的數量不要大於CPU的核心數。一般Thread數量都會使用CPU核心數+1的公式,但在Java Concurrency In Practice中,有提供根據CPU bound vs IO bound比率去tune thread pool size的方法,大家可以參考。
- 基於不可靠、不好測試與不好移植的原因,作者建議大家別用Thread.yield還有控制Thread priority去解決排班問題。
Reference:
- Effective Java, 3/e, Item 84。
- Java Concurrency In Practice, 8.2. Sizing Thread Pools
留言
張貼留言