0

この質問は、この質問のフォローアップです。

基本的に私がやっていることは、ThreadPoolExecutor1 つのスレッドだけで を宣言することです。各タスクが少し遅れて実行されるように、メソッドをオーバーライドしbeforeExecute()てスリープ状態にします。私のスレッドは一種のスラッシングであるため、これは基本的にCPUを他のスレッドに譲るためです。

したがって、予想される動作は次のとおりです。

の新しいタスクごとにThreadPoolExecutor、タスクを実行する前に before execute 関数を呼び出すため、タスクを実行する前に約 20 秒間スリープします。

しかし、これは私が見るものです:

送信された新しいタスクごとに:

  1. タスクを実行します
  2. beforeExecute メソッドを呼び出します
  3. 20秒くらい寝ます
  4. タスクを再実行してください!

1. と 2. の順序は常に同じではありません。

ここに私の質問があります:

  1. スリープ後/スリープ中に新しいスレッドが入ってきて、実際のスレッドがスリープしている間に先に進み、すぐにタスクを実行しているようです。
    ではThreadPoolExecutor、既存のスレッドがスリープ状態になるとすぐに、[スレッドが終了したと考えて] 新しいスレッドを生成しますか?? 私は keepAliveTime > sleeptime を入れようとしました..上記のアサーションが真の場合..少なくともスリープ時間以上待って新しいスレッドを生成するように...[その間、スリープ状態のスレッドが起動し、新しいスレッドを生成するというThreadPoolExecutor考えを捨てます
  2. 新しいスレッドを生成してすぐにタスクを実行したとしても、スリープ状態のスレッドが起動した後にタスクが再実行されるのはなぜですか !! その前にタスクキューからタスクを取り出してはいけませんか??
  3. ここで何か不足していますか?このシナリオをデバッグする他の方法はありますか?

=>目的のタスクを実行するために私が考えていた別の方法[問題を解決しない]は、ランナブルをもう1つのランナブルでラップし、内側のランナブルを呼び出す前に外側のランナブルをスリープさせることでした。

4

2 に答える 2

2

あなたが探しているのはScheduledExecutorServiceだと思います

あなたの質問について私が理解していることから、 scheduleAtFixedRate(...) は取引を行う必要があります:

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)

指定された初期遅延の後に最初に有効になり、その後指定された期間で有効になる定期的なアクションを作成して実行します。つまり、実行は initialDelay の後に開始され、次に initialDelay+period、次に initialDelay + 2 * period というようになります。

于 2010-10-07T18:27:21.637 に答える
0
  1. いいえ、それはそれがどのように機能するかではありません。は、そのワーカーが、、、、またはその他の状態ThreadPoolExecutorであっても、ワーカースレッドがあることを認識しています。RUNNABLEWAITINGBLOCKED
  2. タスクは、メソッドが呼び出されるBlockingQueueずっと前から削除されます。beforeExecute
  3. APIのコードを自分で見て、APIが何をしているのかを判断できます。すべてのJavaJDKインストールには、Javaライブラリ全体を含む「src.zip」ファイルが含まれています。まだ行っていない場合は、このソースをEclipseに添付して、Eclipseでデバッグしているときに、ライブラリメソッドに飛び込むと、クラスファイルだけでなくソースが表示されます。
于 2010-10-07T20:33:05.930 に答える