问个多线程的问题

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
不知道是不是楼主的意思,可以继续留言探讨。