JAVAスレッド池作成の注意事項


1、スレッドまたはスレッド池を作成する時は、意味のあるスレッド名を指定してください。エラーが発生した場合はトレースしてください。スレッドプールを作成する際は、ThreadFactoryを伴うコンストラクターを使用して、独自のThreadFactoryを提供して、第三者を使って実現してください。

ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
.setNameFormat("demo-pool-%d").build();
ExecutorService singleThreadPool = new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());

singleThreadPool.execute(()-> System.out.println(Thread.currentThread().getName()));
singleThreadPool.shutdown();


public class TimerTaskThread extends Thread {
public TimerTaskThread(){
super.setName("TimerTaskThread"); …
}
2、スレッド池はExectorsを使って作成することが許されず、ThreadPool Exectorの方式を通じて、このような処理方式は書いた学生にスレッド池の運行規則をより明確にさせ、資源の消耗のリスクを回避する。
説明:Exectorsが返すスレッド池のオブジェクトの弊害は以下の通りです。
1)FixedThreadPoolとSingleThreadPool:
  許可の要求キュー長はInteger.MAX_である。VALEは、大量の要求が積み重なって、OOMを引き起こすかもしれない。
2)CachedThreadPool:
_; 許可の作成スレッド数はInteger.MAX_である。VALEは、大量のスレッドを作成し、OOMを引き起こす可能性がある。
Positive example 1:

//org.apache.commons.lang3.concurrent.BasicThreadFactory
ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1,
new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());
Positive example 2:

ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
.setNameFormat("demo-pool-%d").build();

//Common Thread Pool
ExecutorService pool = new ThreadPoolExecutor(5, 200,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());

pool.execute(()-> System.out.println(Thread.currentThread().getName()));
pool.shutdown();//gracefully shutdown
Positive example 3:

<bean id="userThreadPool"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="10" />
<property name="maxPoolSize" value="100" />
<property name="queueCapacity" value="2000" />

<property name="threadFactory" value= threadFactory />
<property name="rejectedExecutionHandler">
<ref local="rejectedExecutionHandler" />
</property>
</bean>
//in code
userThreadPool.execute(thread);
3、スレッドリソースはスレッド池を通じて提供しなければならず、アプリケーションにおいて自ら明示的にスレッドを作成することは許されない。
説明:
スレッドプールを使用する利点は、スレッドの作成と廃棄にかかる時間とシステムリソースのオーバヘッドを低減し、リソース不足を解決することである。
スレッドプールを使わないと、システムが同じスレッドを大量に作成してメモリを使い果たしたり、「過スイッチング」したりする問題があります。

ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
.setNameFormat("demo-pool-%d").build();
ExecutorService singleThreadPool = new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());

singleThreadPool.execute(()-> System.out.println(Thread.currentThread().getName()));
singleThreadPool.shutdown();
以上はJAVA作成スレッド池の注意事項の詳細です。JAVA作成スレッド池の注意事項に関する資料は他の関連記事に注目してください。