handle的思考

其实Android是基于消息机制的,通过Looper、Handler来实现消息循环,在线程间相互通讯.Looper里保存了消息列表,通过Handler发送的消息都会保存在Looper里先,然后在loop()方法里,遍历消息列队,分发消息.Handler负责传送消息,处理消息.So,多线程通讯的原理就是,通过另一个线程handler来发送消息,因为Android里主要是跟UI线程通讯,所以一般就在UI线程创建Handler,在工作线程调用这个Handler来发送消息,但并不表示只有UI线程才能有Hanlder,其实要跟UI线程通讯,Handler在哪创建不是重点,重点是,创建这个Handler时使用的Looper对象在哪.
UI线程默认会创建Looper,而工作线程(就是用户自己创建,用于处理耗时操作)默认没有Looper,所以,可以直接在UI线程new Handler,但是在工作线程,需要先调Looper.prepare(),给当前线程创建Looper对象.
如果是调用没有参数的构造方法创建Handler,即new Hanlder(),默认使用的是当前线程的Looper对象.
所以,在工作线程中先Looper.prepare(),再new Hanlder(),这样的Handler是无法与UI线程通讯的.但是Handler还有个带Looper对象参数的构造方法,传入主线程的Looper,另外,Looper类有个静态获取主线程Looper对象的方法:Looper.getMainLooper()
so,在工作线程中创建与UI线程通讯的Handler,可以这样:
Handler mHandler=new Handler(Looper.getMainLooper());
无需再传入UI线程的Looper或者Handler对象作参数.

仔细分析下列代码:#include <stdio.h> #include <stdlib.h> #include <windows.h> #define N 5 #define LEFT (i + N - 1) % N #define RIGHT (i + 1) % N #define THINKING 0 #define HUNGRY 1 #define EATING 2 #define MAX_EATING_TIMES 3 int state[N]; // 每个哲学家的状态 HANDLE mutex; // 互斥锁 HANDLE s[N]; // 条件变量 int eating_times[N]; // 每个哲学家已经就餐的次数 void test(int i) { if (state[i] == HUNGRY && state[LEFT] != EATING && state[RIGHT] != EATING) { state[i] = EATING; eating_times[i]++; printf("哲学家 %d 拿到筷子开始进餐,已经就餐了 %d 次\n", i, eating_times[i]); ReleaseSemaphore(s[i], 1, NULL); } } void pickup(int i) { WaitForSingleObject(mutex, INFINITE); state[i] = HUNGRY; printf("哲学家 %d 饥饿了,开始思考和拿起左手边的筷子\n", i); test(i); ReleaseMutex(mutex); WaitForSingleObject(s[i], INFINITE); } void putdown(int i) { WaitForSingleObject(mutex, INFINITE); state[i] = THINKING; printf("哲学家 %d 放下筷子,开始思考\n", i); test(LEFT); test(RIGHT); ReleaseMutex(mutex); } DWORD WINAPI philosopher(LPVOID lpParam) { int i = (int)lpParam; while (eating_times[i] < MAX_EATING_TIMES) { Sleep(rand() % 5000 + 1000); // 思考一段时间 pickup(i); Sleep(rand() % 5000 + 1000); // 进餐一段时间 putdown(i); } return 0; } int main() { int i; HANDLE thread[N]; srand(GetTickCount()); mutex = CreateMutex(NULL, FALSE, NULL); for (i = 0; i < N; i++) { s[i] = CreateSemaphore(NULL, 0, 1, NULL); state[i] = THINKING; eating_times[i] = 0; } for (i = 0; i < N; i++) { thread[i] = CreateThread(NULL, 0, philosopher, (LPVOID)i, 0, NULL); if (thread[i] == NULL) { printf("创建线程失败!\n"); return 0; } } WaitForMultipleObjects(N, thread, TRUE, INFINITE); CloseHandle(mutex); for (i = 0; i < N; i++) { CloseHandle(s[i]); } return 0; }
06-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值