我用下面的阻塞队列替换了以下代码 为什么我得到队列完全异常 - 是不是阻止队列预期会阻止这种情况?
Main
阻塞等价物 -
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){}
}
}
}
}
答案 0 :(得分:0)
由于wait()
和notify()
是阻止操作,您应该使用BlockingQueue
:put()
和take()
中的阻止操作。作为一般性建议:永远不会吞下InterruptedException
。 Here是关于处理InterruptedException
的好文章。
因此BlockingQueue
替换为synchronized
应如下所示:
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();
}
}
}
}