最近正在看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是什么东西。
谢谢,请指教。
请教一下下边的代码应该怎么解释
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是什么东西。
谢谢,请指教。
解决方案 »
- 大家帮找一个毛病,为什么窗体中没有调用数据库的内容?
- 急!!!!!!请问:如何弹出窗口,关闭系统窗口?? 急!!!!!!急!!!!!!急!!!!!!急!!!!!!急!!!!!!急!!!!!!急!!!!!!
- 求对于日期加减法所用到的类或代码提示
- 运行Java程序时为什么总是出现以下情况啊
- 请问Java网络编程如何在不使用多线程的情况下实现异步返回?
- 关于float类型的误差问题
- %java_home%\lib\dt.jar,dt.jar是什么?有什么作用。?
- 小弟刚学java socket,请教个关于发送list的问题
- UltraEdit java 编译运行设置 (中午 刚刚整理处理 给其它有用的兄弟)
- 有没有这样的软件:把一个不标准格式的JAVA原代码转换为具有标准(或比较标准)编码规范的代码。
- 关于常用了类计数方法
- 请问如何用swt实现图片切换的百叶窗效果,或者随机线条效果
这里就是用synchronized来同步一个代码块。就是相当于这一块代码需要同步保护,没什么其他的意思。
mFirst就可以理解为一个同步的互斥量。用于保证只能同时有一个对象(调用这个方法的对象)持有该对象。
至于你说的mFirst没有定义 我就不清楚了 一般是有定义的 而且一般是需要引用类型
不过,这段代码里边还有一个问题,请教一下。
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又是什么意思呀?
多谢,一会结贴
因为一但这个互斥变量是可以改变的(应该是指改变引用),那个同步就很可能被破坏。
可以这样理解,顶级父类Object。你这里添加@Override就是重载Ojbect这个父类的toString方法。
你也可以去不写。不影响代码的运行。
wait()是线程的一个方法,可以根据英文来理解,wait(等待)。就要你等等。代码运行到这里暂时不跑了。
等你用notify()方法或者notifyall()在让它继续跑起来。
这样讲我认为,比较通俗。
要想多学习,还得看看“核心java”这本书,里面的东西比较容易懂。