2009-07-15 5 views
2

私はStackオブジェクトを複数のスレッドで処理しています。スレッドの1つは、スタックオブジェクトに対してポップ操作を実行するワーカースレッドです。私は、スタックが空のケースを処理したいと私はより良いアプローチと理由は、上記のこれは、二つのオプションcatch EmptyStackExceptionと比較すると、スタックが空です

try{ 
    Object obj = (Object) d_stackObj.pop(); 
    } 
catch (EmptyStackException e) 
    { ...} 

OR

if(! d_stackObj.empty()) 
    Object obj = (Object) d_stackObj.pop(); 
else 
    { ...} 

私の質問がある参照してください?

ありがとうございます!

答えて

5

2番目の例のようにスタックが空であるかどうかを確認する方がよいと思います。

例外をキャッチするのはコストがかかります!

+2

私はパフォーマンスについて心配しないでください –

0

プログラムフローの目的で例外をキャッチすることは悪い習慣と考えられます。後者の方法を使用します。

0

例外を作成するためのオーバーヘッドがあります。この場合でも避けられないのは避けてください。

ここでは、例外の使用法について説明しています。O 'Reilly article 1つのキーポイント(2ページ目)。

は、フロー制御

3

秒間の例外を使用しないでください。

例外は予期しないプログラム条件であり、ビジネスロジックではありません。

例外をすべて使用すると、パフォーマンスに問題が生じることもあります。

3

第2のアプローチは、あなたはすべての回であなたのスタックからオブジェクトを開くことができますスレッドを1つだけ持っている唯一の場合を働くだろう。

そうでなければ、Stack自体がスレッドセーフであるにもかかわらず、複合ロジックが正しく動作しません。他のスレッドはempty()コールとpop()コールの間でスライスする可能性があります。それは、単一原子の呼び出しを使用して

synchronized (d_stackObj) { // you must use the stack object as the lock 
    if (!d_stackObj.empty()) { 
     Object obj = (Object)d_stackObj.pop(); 
    } else { 
     ... 
    } 
} 

最初のアプローチは、このような場合であっても作業を行います。あなたは、スタックからオブジェクトをポップする複数のスレッドがある場合は、次の操作を実行する必要があるかもしれません

+0

素晴らしいです!私はそれを考えなかった。ありがとう! –

関連する問題