1

以下は、ブロッキング キューの 1 つのコンシューマの簡単な実装です。私の質問は、本番環境に対応させるために必要な追加のコードは何ですか? この消費者が永遠に存在する必要があると仮定します。

たとえば、いくつかの質問:

  1. while(true) で十分ですか?
  2. 行っていたことを再開できるように InterruptedException を取得した場合はどうすればよいですか?
  3. スレッドがハングするとどうなりますか?
  4. 例外が原因でスレッドが終了した場合はどうなりますか?

私の全体的な質問は、このシングルスレッド コンシューマーの管理と監視の実装に関するいくつかのアイデアになると思います。または、基本実装を提供する既存のライブラリがあるかどうか。

どうもありがとう!

public class Consumer implements Runnable{

    private BlockingQueue queue;

    public Consumer (BlockingQueue queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        while(true){
            try {
                Object task = queue.take();
                ...
            } catch (InterruptedException ex) {
                Thread.currentThread().interrupt();
            }
        }
    }
}
4

2 に答える 2

4

while(true) で十分ですか?

おっとっと。@Cratylus は、常に使用する必要があることを強調しています。

 while (!Thread.currentThread().isInterrupted()) {

例外のキャッチについては、宗教的である必要がありRuntimeExceptionますThrowable。少なくとも、終了する前にメッセージをキャッチしてログに記録することを検討する必要があります。

行っていたことを再開できるように InterruptedException を取得した場合はどうすればよいですか?

それは、スレッドに何をさせたいかによって異なります。IMO、スレッドが中断されたとき、それは(ええと)中断されるべきです。thread.stop()は多くの理由で非推奨であるため、実際thread.interrupt()にスレッドの実行を停止する唯一の方法です。これは、クリーンアップして終了する必要があることを意味します。

} catch (InterruptedException ex) {
    // always a good practice to re-interrupt
    Thread.currentThread().interrupt();
    // but now what to do?  I vote for stopping the thread
    return;
}

スレッドがハングするとどうなりますか?

プログラムにバグがない限り、これは決して起こらないはずです。永遠に待機する可能性がありますqueue.take()が、割り込みによって追い出されるはずです。

synchronizedデッドロックを防ぐために、複数のセクションに注意してください。java.util.concurrent.*クラス ( BlockingQueue、 、 ...) を使用してExecutors、ユーザー コードが問題を引き起こす可能性を教えてください。Atomic*クラスを使用します。スレッド間で共有されるすべてのデータは、正しくsynchronizedまたはvolatile.

例外が原因でスレッドが終了した場合はどうなりますか?

どうしたいですか?それがあなたがしたいことであるなら、あなたは(再び)宗教的に例外をキャッチするべきです。例外が発生したときにスレッドを停止する場合は、例外をキャッチしてログに記録し、クリーンアップして戻ります。例外処理に対する簡単な答えはありません。

于 2013-01-23T21:40:02.987 に答える
3

while(true) で十分ですか?

いいえ、あなたはするべきですwhile(!interrupted)

行っていたことを再開できるように InterruptedException を取得した場合はどうすればよいですか?

中断された例外が発生した場合は、再開しないでください。やめる合図です

スレッドがハングするとどうなりますか?

割り込みで終了する場合はそうではありません。現在のフォームでハングします(現在コーディングしているため、停止する方法はありません)

例外が原因でスレッドが終了した場合はどうなりますか?

終了します。意味がわかりません。

于 2013-01-23T21:41:34.947 に答える