parent
5d6755466d
commit
8130b89644
@ -0,0 +1,115 @@ |
|||||||
|
--- |
||||||
|
线程间消息传递机制 |
||||||
|
--- |
||||||
|
|
||||||
|
1. 消息循环过程是怎样的? |
||||||
|
2. 消息是怎么发送的? |
||||||
|
3. 消息是怎么处理的? |
||||||
|
|
||||||
|
```java |
||||||
|
// Looper#loop |
||||||
|
public static void loop(){ |
||||||
|
final Looper me = myLooper(); |
||||||
|
final MessageQueue queue = me.mQueue; |
||||||
|
for(;;){ |
||||||
|
Message msg = queue.next(); |
||||||
|
if(msg == null){ |
||||||
|
return; |
||||||
|
} |
||||||
|
msg.target.dispatchMessage(msg); |
||||||
|
msg.recycleUnchecked(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public void dispatchMessage(Message msg){ |
||||||
|
if(msg.callback != null){ |
||||||
|
handleCallback(msg); |
||||||
|
}else{ |
||||||
|
if(mCallback!=null){ |
||||||
|
if(mCallback.handleMessage(msg)){ |
||||||
|
return; |
||||||
|
} |
||||||
|
} |
||||||
|
handleMessage(msg); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
Message next(){ |
||||||
|
int nextPollTimeoutMillis = 0; |
||||||
|
for(;;){ |
||||||
|
nativePollOnce(ptr, nextPollTimeoutMillis); |
||||||
|
Message msg = mMessages; |
||||||
|
mMessages = msg.next; |
||||||
|
msg.next = null; |
||||||
|
msg.markInUse(); |
||||||
|
return msg; |
||||||
|
} |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
```c++ |
||||||
|
void MessageQueue_nativePollOnce(JNIEnv* env, jobject obj, jlong ptr, jint timeoutMillis){ |
||||||
|
NativeMessageQueue* nativeMessageQueue = reinterpret_cast<NativeMessageQueue*>(ptr); |
||||||
|
nativeMessageQueue->pollOnce(env, obj, timeoutMillis); |
||||||
|
} |
||||||
|
void NativeMessageQueue::pollOnce(JNIEnv* env, jobject pollObj, int timeoutMillis){ |
||||||
|
mLooper->pollOnce(timeoutMillis); |
||||||
|
} |
||||||
|
int Looper::pollOnce(int timeoutMillis, int* outFd, int* outEvents, ...){ |
||||||
|
int result = 0; |
||||||
|
for(;;){ |
||||||
|
if(result!=0){ |
||||||
|
return result; |
||||||
|
} |
||||||
|
result = pollInner(timeoutMillis); |
||||||
|
} |
||||||
|
} |
||||||
|
int Looper::pollInner(int timeoutMillis){ |
||||||
|
struct epoll_event eventItems[EPOLL_MAX_EVENTS]; |
||||||
|
int eventCount = epoll_wait(mEpollFd, eventItems, ..., timeoutMillis); |
||||||
|
for(int i=0;i<eventCount;i++){ |
||||||
|
int fd = eventItems[i].data.fd; |
||||||
|
uint32_t epollEvents = eventItems[i].events; |
||||||
|
if(fd == mWakeEventFd){ |
||||||
|
if(epollEvents & EPOLLIN){ |
||||||
|
awoken(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
```java |
||||||
|
Message next(){ |
||||||
|
int nextPollTimeoutMillis = 0; |
||||||
|
for(;;){ |
||||||
|
nativePollOnce(ptr, nextPollTimeoutMillis); |
||||||
|
Message msg = mMessage; |
||||||
|
mMessage = msg.next; |
||||||
|
msg.next = null; |
||||||
|
msg.markInUse(); |
||||||
|
return msg; |
||||||
|
} |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
插入消息: |
||||||
|
|
||||||
|
```java |
||||||
|
boolean enqueueMessage(Message msg, long when) { |
||||||
|
nativeWake(mPrt); |
||||||
|
return true; |
||||||
|
} |
||||||
|
``` |
||||||
|
|
||||||
|
```c++ |
||||||
|
void MessageQueue_nativeWake(JNIEnv* env, jclass clazz, jlong ptr){ |
||||||
|
NativeMessageQueue* nativeMessageQueue = reinterpret_cast<NativeMessageQueue*>(ptr); |
||||||
|
nativeMessageQueue->wake(); |
||||||
|
} |
||||||
|
void Looper::wake(){ |
||||||
|
uint64_t inc = 1; |
||||||
|
write(mWakeEventFd, &inc, sizeof(uint64_t)); |
||||||
|
} |
||||||
|
``` |
||||||
|
|
Loading…
Reference in new issue