4

私のメインプロセスは外部ライブラリメソッドを呼び出します。このメソッドは時々ハングします。外部ライブラリは他社が担当しているため修正できません。

実行タイマーが定義されたライブラリ呼び出しにスレッドを使用したい。メソッド呼び出しに時間がかかる場合、メソッド呼び出しが行われるRunnableのあるスレッドは停止し、メインプロセスが進む必要があります。

  1. メインスレッド待機
  2. スレッドを実行する
    • タイマースレッドを開始します
    • タイマースレッドが終了したら、スレッドの実行を強制終了します
  3. スレッド停止メインを実行します
  4. スレッド履歴書

このロジックのコード、使用できるデザインパターン、または情報を読み取ることができるインターネットページを持っている人はいますか?

ありがとう

4

3 に答える 3

2

これは、スレッドが終了するまで最大30秒待機します。

Thread t = new Thread() {
  public void run() {
    badExternalMethod();
    synchronized (this) {
      notifyAll();
    }
  }
};

synchronized (t) {
  t.start();
  try {
    t.wait(30000); // 30 secs
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
}

//tが完了またはタイムアウトしました

于 2009-05-07T10:42:32.123 に答える
2

Java 5以降のjava.lang.concurrentパッケージ、特にCompletionServiceインターフェースとそれを実装するクラスを見てください。

このインターフェースには、タスクを送信してタスクが完了するのを待つか、タイムアウト後に続行できるようにする呼び出しが含まれています。

于 2009-05-11T11:04:10.583 に答える
1

30秒後に実行中のスレッドを魔法のように停止させることはできません。あなたがする必要があるのは、時間が経過した後、そのスレッドにいくつかの状態をチェックさせることです。時間がかかりすぎてreturn、実行メソッドから取得されていることに注意してください。

これを行うには、おおよそ2つのアプローチがあります。

  1. ライブラリ呼び出しスレッドに、それぞれに少し時間がかかる「チャンク」で操作を実行させ、各チャンク間のステータスを確認します。たとえば、数十万のレコードを処理している場合、1つのバッチで数百を処理してから、フラグを確認できます。または、タイムアウトを使用してブロックする可能性のある通話を行う場合は、タイムアウトを500ミリ秒に設定し、各通話間のフラグを確認します。
  2. 時間切れになったときにメインスレッドにライブラリ呼び出しスレッドを中断させ、ライブラリスレッドが割り込みを正しく処理し、その場合はフラグをチェックするようにします。これには、ライブラリ呼び出しスレッドが割り込み可能なメソッドを実行する必要がありますが、実行時間が長くなる可能性のあるメソッドは割り込みを許可する必要があります。

どちらの場合も、スレッドの1つ(おそらく他に何もすることがないのでメインスレッド)にtrue、時間が経過したら「停止」フラグを設定する必要があります(この変数は揮発性であると宣言する必要があるため、更新はすべてのスレッドで表示されます)。同様に、ライブラリ呼び出しスレッドがこのフラグをtrueと見なした場合、通常はrun()メソッドから戻ることにより、実行中の処理を停止する必要があります。

メインスレッドからライブラリスレッドを実際に強制終了するべきではありません。Thread.stop、Thread.suspend、およびThread.resumeが非推奨になっている理由、および上記で説明したものと非常によく似た代替案を参照してください。:-)

于 2009-05-07T10:52:28.527 に答える