最近正在看android代码,不过不太懂java语法。
请教一下下边的代码应该怎么解释
    QueuedEvent getEvent(long timeoutMS) {
        long begin = SystemClock.uptimeMillis();
        final long end = begin+timeoutMS;
        long now = begin;
        synchronized (mFirst) {
            while (mFirst.next == mLast && end > now) {
                try {
                    mWakeLock.release();
                    mFirst.wait(end-now);
                }
                catch (InterruptedException e) {
                }
                now = SystemClock.uptimeMillis();
                if (begin > now) {
                    begin = now;
                }
            }
            if (mFirst.next == mLast) {
                return null;
            }
            QueuedEvent p = mFirst.next;
            mFirst.next = p.next;
            mFirst.next.prev = mFirst;
            p.inQueue = false;
            return p;
        }
    }这是一个类中的成员函数,但是这个函数具体要怎么执行呢?我实在不明白里边的synchronized到底是什么,如果是一个函数,怎么没有定义返回值,而且看synchronized的返回值应该就是getEvent需要返回的类型,但是,没有显示的调用synchronized,就算是顺序执行下来,但是synchronized的入口参数mFirst又怎么解释,没有类型定义,我都不知道mFirst是什么东西。
    谢谢,请指教。

解决方案 »

  1.   

    synchronized 一般可以用于同步方法和代码块。
    这里就是用synchronized来同步一个代码块。就是相当于这一块代码需要同步保护,没什么其他的意思。
    mFirst就可以理解为一个同步的互斥量。用于保证只能同时有一个对象(调用这个方法的对象)持有该对象。
    至于你说的mFirst没有定义 我就不清楚了 一般是有定义的 而且一般是需要引用类型
      

  2.   

    synchronized线程同步,避免死锁。
      

  3.   

    多谢,明白了。
    不过,这段代码里边还有一个问题,请教一下。
    mFirst的定义我找到了,是在这个类中定义的final QueuedEvent mFirst;(至少我在这个文件中只找到这么一个地方定义mfirst)。但是对于QueueEvent类    static class QueuedEvent {
            InputDevice inputDevice;
            long whenNano;
            int flags; // From the raw event
            int classType; // One of the class constants in InputEvent
            Object event;
            boolean inQueue;        void copyFrom(QueuedEvent that) {
                this.inputDevice = that.inputDevice;
                this.whenNano = that.whenNano;
                this.flags = that.flags;
                this.classType = that.classType;
                this.event = that.event;
            }        @Override
            public String toString() {
                return "QueuedEvent{"
                    + Integer.toHexString(System.identityHashCode(this))
                    + " " + event + "}";
            }
            
            // not copied
            QueuedEvent prev;
            QueuedEvent next;
        }
    其中并没有看到getEvent函数中调用的mFirst.wait()函数的实现。难道这个wait也有什么特殊的地方吗?
    另外,@Override关键字是不是重载的意思,如果是但是QueuedEvent这个类没有说是继承自那个类呀。如果不是,这个@Override又是什么意思呀?
    多谢,一会结贴
      

  4.   

    wait方法是Object类的方法 所有java的类型都会继承这个方法的吧
      

  5.   

    还有一点就是,synchronized同步保护的变量一般都是final的  正如你的代码里的一样 
    因为一但这个互斥变量是可以改变的(应该是指改变引用),那个同步就很可能被破坏。
      

  6.   

    @Override关键字,是jdk的新特征,放在成员方面前面,表示这个方法是重载了父类方法。
    可以这样理解,顶级父类Object。你这里添加@Override就是重载Ojbect这个父类的toString方法。
    你也可以去不写。不影响代码的运行。
    wait()是线程的一个方法,可以根据英文来理解,wait(等待)。就要你等等。代码运行到这里暂时不跑了。
    等你用notify()方法或者notifyall()在让它继续跑起来。
    这样讲我认为,比较通俗。
    要想多学习,还得看看“核心java”这本书,里面的东西比较容易懂。