有多个线程同时往一个BlockingQueue中放数据,多个线程从这个BlockingQueue中取数据
怎么做才能保证put 或 take 之后 正确的打印出这个队列中元素的数目呢?
如下:
take线程:
while (true) {
lock.lock();
Integer i = 0;
try {
i = (Integer) queue.take();
System.out.println(this.getName() + " take " + i + " ......" + queue.size());
} catch (InterruptedException ex) {
Logger.getLogger(PutThread.class.getName()).log(Level.SEVERE, null, ex);
} finally {
lock.unlock();
} }
put线程:
while (true) {
lock.lock();
Integer i = new Random().nextInt(10) + 1;
try {
queue.put(i);//此处应用put take 。如果用add时,成功返回true,失败则抛出异常
} catch (InterruptedException ex) {
Logger.getLogger(PutThread.class.getName()).log(Level.SEVERE, null, ex);
} finally {
lock.unlock();
}
System.out.println(this.getName() + " add " + i + " ......" + queue.size());
}如果这两个锁是同一个的话显然是不行的。不一样的话也不可以。应该怎么办呢?
或者是要求这样的话就不能使用BlockingQueue了?????
怎么做才能保证put 或 take 之后 正确的打印出这个队列中元素的数目呢?
如下:
take线程:
while (true) {
lock.lock();
Integer i = 0;
try {
i = (Integer) queue.take();
System.out.println(this.getName() + " take " + i + " ......" + queue.size());
} catch (InterruptedException ex) {
Logger.getLogger(PutThread.class.getName()).log(Level.SEVERE, null, ex);
} finally {
lock.unlock();
} }
put线程:
while (true) {
lock.lock();
Integer i = new Random().nextInt(10) + 1;
try {
queue.put(i);//此处应用put take 。如果用add时,成功返回true,失败则抛出异常
} catch (InterruptedException ex) {
Logger.getLogger(PutThread.class.getName()).log(Level.SEVERE, null, ex);
} finally {
lock.unlock();
}
System.out.println(this.getName() + " add " + i + " ......" + queue.size());
}如果这两个锁是同一个的话显然是不行的。不一样的话也不可以。应该怎么办呢?
或者是要求这样的话就不能使用BlockingQueue了?????
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货