2017-05-13 4 views
0

以下のコードを以下のブロッキングキューに置き換えました。
なぜキューの完全な例外が発生するのですか?それを防ぐことが期待されるブロックキューではありませんか?ブロッキングキューを同期交換する

class Offer implements Runnable{ 
     Random r=new Random(); 
     public void run(){ 
      while(System.currentTimeMillis() < end){ 
       synchronized(b){ 
        try{ 
         while(b.size()>10){ 
          b.wait(); 
         } 
         b.add(r.nextInt()); 
         b.notify(); 

        }catch(InterruptedException x){} 
       } 
      } 
     }  
    } 

    class Take implements Runnable{ 
     public void run(){ 
      while(System.currentTimeMillis() < end){ 
       synchronized(b){ 
        try{ 
         while(b.size()<1){ 
          b.wait(); 
         } 
         b.remove(0); 
         b.notify(); 


        }catch(InterruptedException x){} 
       } 
      } 
     }  
    } 

BlockingQueueの同等 - wait()notify()として

BlockingQueue<Integer> b = new ArrayBlockingQueue<Integer>(10); 
    class Offer implements Runnable{ 
     Random r=new Random(); 
     public void run(){ 
      while(System.currentTimeMillis() < end){ 
       b.add(r.nextInt()); 
      } 
     }  
    } 

    class Take implements Runnable{ 
     public void run(){ 
      while(System.currentTimeMillis() < end){ 
       b.remove(0); 
      } 
     }  
    } 
+1

をあなたは十分に速く消費していないキューがいっぱいになります。 'add'ではなく' put'を使う必要があります。要するに、RTFM。 –

+0

FTFM: "add":容量制限に違反することなく即座に指定された要素をこのキューに挿入します。成功した場合はtrueを返し、現在空き領域がない場合はIllegalStateExceptionをスローします。オファーを使うのが一般に好ましい」と述べた。 –

+0

[documentation](https://developer.android.com/reference/packages.html)には、 'put'と' take'ブロックがあります。 'add'と' remove'メソッドは異なるセマンティクスを持ち、 'add'は例外をスローし、' remove'は成功を示すために 'true' /' false'を返します。 RTFM。 – markspace

答えて

0

は操作をブロックしている、あなたはBlockingQueueからブロック操作を使用する必要があります。put()take()。そして、一般的な勧告として:は呑み込まないでくださいInterruptedExceptionHereInterruptedExceptionを扱う良い記事です。

だから、​​にごBlockingQueue交換は次のようになります。

BlockingQueue<Integer> b = new ArrayBlockingQueue<Integer>(10); 

class Offer implements Runnable{ 
    Random r=new Random(); 
    public void run(){ 
     while(System.currentTimeMillis() < end){ 
      try { 
       b.put(r.nextInt()); 
      } catch (InterruptedException e) { 
       Thread.currentThread().interrupt(); 
      } 
     } 
    } 
} 

class Take implements Runnable{ 
    public void run(){ 
     while(System.currentTimeMillis() < end){ 
      try { 
       b.take(); 
      } catch (InterruptedException e) { 
       Thread.currentThread().interrupt(); 
      } 
     } 
    } 
} 
関連する問題