この質問は、この質問のフォローアップです。
基本的に私がやっていることは、ThreadPoolExecutor
1 つのスレッドだけで を宣言することです。各タスクが少し遅れて実行されるように、メソッドをオーバーライドしbeforeExecute()
てスリープ状態にします。私のスレッドは一種のスラッシングであるため、これは基本的にCPUを他のスレッドに譲るためです。
したがって、予想される動作は次のとおりです。
の新しいタスクごとにThreadPoolExecutor
、タスクを実行する前に before execute 関数を呼び出すため、タスクを実行する前に約 20 秒間スリープします。
しかし、これは私が見るものです:
送信された新しいタスクごとに:
- タスクを実行します
- beforeExecute メソッドを呼び出します
- 20秒くらい寝ます
- タスクを再実行してください!
1. と 2. の順序は常に同じではありません。
ここに私の質問があります:
- スリープ後/スリープ中に新しいスレッドが入ってきて、実際のスレッドがスリープしている間に先に進み、すぐにタスクを実行しているようです。
ではThreadPoolExecutor
、既存のスレッドがスリープ状態になるとすぐに、[スレッドが終了したと考えて] 新しいスレッドを生成しますか?? 私は keepAliveTime > sleeptime を入れようとしました..上記のアサーションが真の場合..少なくともスリープ時間以上待って新しいスレッドを生成するように...[その間、スリープ状態のスレッドが起動し、新しいスレッドを生成するというThreadPoolExecutor
考えを捨てます - 新しいスレッドを生成してすぐにタスクを実行したとしても、スリープ状態のスレッドが起動した後にタスクが再実行されるのはなぜですか !! その前にタスクキューからタスクを取り出してはいけませんか??
- ここで何か不足していますか?このシナリオをデバッグする他の方法はありますか?
=>目的のタスクを実行するために私が考えていた別の方法[問題を解決しない]は、ランナブルをもう1つのランナブルでラップし、内側のランナブルを呼び出す前に外側のランナブルをスリープさせることでした。