6

私はプロデューサーコンシューマーモデル(Javaのプロデューサースレッドとコンシューマースレッド)を書き込もうとしていました

メソッドとクラスのメソッドInterruptedExceptionによってスローされたものをどのように処理するのか疑問に思いましたThread.sleepObjectwait()

package producerconsumer;

import java.util.ArrayList;

public class Consumer implements Runnable {

    ArrayList<Integer> container;

    @Override
    public void run() {
        while(true){
        System.out.println("Consumer Thread Running");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        if(null==container){
            System.out.println("container is null");
        }
        //Removing values from Arraylist
        synchronized (container) {
            if(container.size()==0){
                try {
                    container.wait();
                } catch (InterruptedException e) {
                    //How to tackle this exception
                    e.printStackTrace();
                }
            }
            Integer removedInteger = container.remove(container.size()-1);
            System.out.println("removedInteger..."+removedInteger);
        }
        }
    }

    public void setContainer(ArrayList<Integer> container) {
        this.container = container;
    }
}

これは私が取った1つの例です。この例では、これらの例外(My Assumption)を処理する必要がない場合があります。

しかし、この例外を処理する必要があるさまざまなシナリオが考えられることを知りたかったのです。

4

1 に答える 1

11

Thread.sleepメソッドとオブジェクトクラスのwaitメソッドによってスローされる中断された例外をどのように処理するのか疑問に思いました

について理解すべき2つの重要なことがありますInterruptedException。まず、スローされると、の割り込みフラグThreadがクリアされます。したがって、常に次のようなことを行う必要があります。

} catch (InterruptedException e) {
    // re-add back in the interrupt bit
    Thread.currentThread().interrupt();
    ...
}

これは非常に重要なパターンです。これにより、自分のコードを呼び出している可能性のある他のコードでも割り込みを検出できるようになります。

第二に、スレッドに関しては、スレッドが中断された場合、おそらくクリーンアップして終了する必要があります。これは確かにプログラマーの責任ですが、一般的な動作は、実行中の操作を終了して終了することです。多くの場合、プログラムがシャットダウンしようとしているためです。

} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
    // we are being interrupted so we should stop running
    return;
}

最後に、例外処理では、デフォルトのEclipseテンプレートは通常間違っています。決してe.printStackTrace();例外ではありません。それをどうするかを考えてください。別の例外として再スローするか、より適切な場所にログを記録するか、スレッド/メソッド/アプリケーションを終了してください。

于 2012-04-25T13:49:52.257 に答える