http://www.iteye.com/topic/44432
[code="java"]private Queue receivedData = new ArrayBlockingQueue(100);
public void receive(byte[] data, int length) {
byte [] ldata = new byte[data.length+1];
System.arraycopy(data, 0, ldata, 0, data.length);
ldata[data.length]=(byte) length;
this.receivedData.add(ldata);
synchronized(receivedData){
this.receivedData.notify();
}
}
private class HandlingThread implements Runnable{
public void run() {
while(true){
if(!receivedData.isEmpty()){
byte[] data = receivedData.remove();
dealReceiveData(data);
}
else{
try {
synchronized(receivedData){
receivedData.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}[/code]
用的blockingqueue 但是我想当队列空的时候wait 怎么操作呢
这里回复都没解决问题
不需要处理,ArrayBlockingQueue自动阻塞
[quote]这是一个典型的“有界缓存区”,固定大小的数组在其中保持生产者插入的元素和使用者提取的元素。一旦创建了这样的缓存区,就不能再增加其容量。试图向已满队列中放入元素会导致放入操作受阻塞;试图从空队列中检索元素将导致类似阻塞。[/quote]
看到了synchronized,Queue已经设计成生产者-消费者模式,多个线程只管往队列里面塞和取就完了,不需要自己加线程控制。仔细看看那Queue的API文档吧。
给你稍微改了下,BlockingQueue有阻塞方法的...
[code]
private BlockingQueue<byte[]> receivedData = new ArrayBlockingQueue<byte[]>(
100);
public void receive(byte[] data, int length) {
byte[] ldata = new byte[data.length + 1];
System.arraycopy(data, 0, ldata, 0, data.length);
ldata[data.length] = (byte) length;
try {
if (this.receivedData.offer(ldata, 3000L, TimeUnit.MILLISECONDS) == false) {
// 此时队列一直处于塞满状态,你在这里处理无法插入的数据...
}
} catch (InterruptedException e) {
// ignore
}
}
private class HandlingThread implements Runnable {
public void run() {
while (true) {
byte[] data;
try {
//在2秒内取一份数据
data = receivedData.poll(2000L, TimeUnit.MILLISECONDS);
if (data != null) {
// 处理data
}
} catch (InterruptedException e) {
// ignore
}
}
}
}
[/code]
楼上那个修改可能有些不合适,每次都需要等待2秒,如果大批量数据来得时候,因为设置了参数反倒会慢很多。
仔细想了一下,楼主的这段代码是有问题的,如果我没看错的话楼主想要在有任务的时候执行任务,当没有任务的时候该线程最好释放资源。
那这里通过blockingqueue 是很不合适的。因为阻塞队列blockingqueue 的主要作用是平衡生成者和消费者之间的关系,这里的wait是自动进行的。楼主的用法可能有些问题。
给你举个例子 http://sgq0085.iteye.com/admin/blogs/1228217
不知道是不是楼主的意思,可以继续留言探讨。