在JavaME中实现阻塞队列:如何优化它?

Mis*_*ith 5 java concurrency producer-consumer java-me

我正在尝试在Java ME中实现一个简单的阻塞队列.在JavaME API中,Java SE的并发实用程序不可用,因此我必须像以前一样使用wait-notify.

这是我的临时实施.我正在使用notify而不是notifyAll因为在我的项目中有多个生产者,但只有一个消费者.我故意使用一个对象进行wait-notify来提高可读性,尽管它浪费了一个引用:

    import java.util.Vector;

    public class BlockingQueue {    
        private Vector queue = new Vector();
        private Object queueLock = new Object();    

        public void put(Object o){
            synchronized(queueLock){
                queue.addElement(o);
                queueLock.notify();
            }       
        }

        public Object take(){
            Object ret = null;
            synchronized (queueLock) {
                while (queue.isEmpty()){
                    try {
                        queueLock.wait();
                    } catch (InterruptedException e) {}
                }

                ret = queue.elementAt(0);
                queue.removeElementAt(0);
            }
            return ret;
        }
    }
Run Code Online (Sandbox Code Playgroud)

我的主要问题是关于put方法.我可以把queue.addElement线放出synchronized块吗?如果是这样,性能会改善吗

此外,同样适用于take:我可以采取两种操作queue出来的synchronized block

任何其他可能的优化?

编辑:
正如@Raam正确指出的那样,消费者线程在被唤醒时可能会饿死wait.那么有什么方法可以防止这种情况呢?(注意:在JavaME中,我没有来自Java SE的所有这些好类.把它想象成旧的Java v1.2)

cla*_*esv 1

Vector 类不保证线程安全,您应该同步对其的访问,就像您所做的那样。除非您有证据表明您当前的解决方案存在性能问题,否则我不会担心。

顺便说一句,我认为使用notifyAll而不是notify支持多个消费者并没有什么坏处。