次のような構造の Java アプリケーションがあります。
- 1 つのスレッド
java.nio.Selector
が IO を監視しています。 java.util.concurrent.ScheduledThreadPoolExecutor
すぐに実行される作業 (IO スレッドによって読み取られた IO をディスパッチする) または遅延後に実行される作業 (通常はエラー) のいずれかを処理するスレッド プール。
にScheduledThreadPoolExecutor
は、作成するスレッド数の上限があります。現在アプリで 5000 ですが、私はその数をまったく調整していません。
アプリをしばらく実行した後、次のスタック トレースを持つ何千ものスレッドを取得します。
"pool-1-thread-5262" prio=10 tid=0x00007f636c2df800 nid=0x2516 waiting on condition [0x00007f60246a5000]
java.lang.Thread.State: TIMED_WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x0000000581c49520> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:196)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2025)
at java.util.concurrent.DelayQueue.poll(DelayQueue.java:209)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.poll(ScheduledThreadPoolExecutor.java:611)
at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.poll(ScheduledThreadPoolExecutor.java:602)
at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:945)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:662)
上記は への呼び出しによって引き起こされていると思いますがschedule(java.lang.Runnable, long, java.util.concurrent.TimeUnit)
、これは確かにアプリで頻繁に発生します。これは予想される動作ですか?
これらすべてのスレッドがぶらぶらしていても、アプリケーションにはまったく影響がないようです— ワーカー スレッドが必要な場合、メソッドTIMED_WAITING
を介して送信されたときにこれらのスレッドがタスクの実行を妨げているようには見えませんがsubmit
、完全には確信が持てません。それ。この保留状態で何千ものスレッドがぶらぶらしていると、アプリやシステムのパフォーマンスに影響がありますか?
メソッドを介して送信されるタスクschedule
は非常に単純です。基本的にChannel
は、Selector
. したがって、これらのタスクはそれほど長く存続するわけではなく、将来のある時点で実行する必要があるだけです。通常のワーカー スレッドは、従来のブロッキング IO を実行して作業を実行し、一般に寿命が長くなります。
関連する質問: メソッドを使用する代わりに、明示的なシングル スレッドで遅延タスクを実行する方がよいschedule
でしょうか? つまり、次のようなループがあります。
DelayedQueue<SomeTaskClass> tasks = ...;
while (true) {
task<SomeTaskClass> = tasks.take();
threadpool.submit(task);
}
DelayQueue はワーカー スレッドを使用してその機能を実装しますか? 今日はただ実験するつもりでしたが、アドバイスをいただければ幸いです。