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);
}
}
}
をあなたは十分に速く消費していないキューがいっぱいになります。 'add'ではなく' put'を使う必要があります。要するに、RTFM。 –
FTFM: "add":容量制限に違反することなく即座に指定された要素をこのキューに挿入します。成功した場合はtrueを返し、現在空き領域がない場合はIllegalStateExceptionをスローします。オファーを使うのが一般に好ましい」と述べた。 –
[documentation](https://developer.android.com/reference/packages.html)には、 'put'と' take'ブロックがあります。 'add'と' remove'メソッドは異なるセマンティクスを持ち、 'add'は例外をスローし、' remove'は成功を示すために 'true' /' false'を返します。 RTFM。 – markspace