Android JNI开发(6)--JNI中使用线程
2017-09-21 14:29
357 查看
JNI中线程是基于Linux的线程,包含头文件#include< pthread.h>
常用的方法有:
大体上就是这么多方法。下面说一下这些方法的作用;
有两种初始化方式:静态、动态;
静态方式:static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
动态方式:(1)可以使用new或者malloc一个pthread_mutex_t 类型变量,用完后记得delete或者free掉。
(2)调用pthread_mutex_init(&mutex, NULL);即可;第一个参数表示互斥锁变量,第二个参数表示互斥锁属性。成功的话返回0
(2)加锁、解锁、测试加锁
pthread_mutex_lock(&mutex);加锁
pthread_mutex_trylock(&mutex);//尝试加锁,不常用,和第一个差不多
pthread_mutex_unlock(&mutex);//解锁
不论哪种类型的锁,都不可能被两个不同的线程同时得到,而必须等待解锁。
(3)销毁互斥锁
pthread_mutex_destroy(&mutex);执行成功返回0;
(1)初始化
同样,和互斥锁一样,也有两种初始化方法;
静态方式:static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
动态方式:(1)可以使用new或者malloc一个pthread_cond_t类型变量,用完后记得delete或者free掉。
(2)调用pthread_cond_init(&cond, NULL);即可;第一个参数表示互斥锁变量,第二个参数表示互斥锁属性。成功的话返回0;
(2)等待和触发
等待
pthread_cond_wait(&cond,&mutex);//条件等待等
4000
待
pthread_cond_signal(&cond);//
pthread_cond_broadcast(&cond);
pthread_cond_timedwait(&cond, &mutex, &ts);//时间等待
无论哪种等待方式,都必须和一个互斥锁配合,以防止多个线程同时请求pthread_cond_wait()(或pthread_cond_timedwait())
的竞争条件(Race Condition);用法如下:
触发
激发条件有两种形式,pthread_cond_signal()激活一个等待该条件的线程,存在多个等待线程时按入队顺序激活其中一个;
而pthread_cond_broadcast()则激活所有等待线程。
(3)销毁
pthread_cond_destroy(&cond);
只有在没有线程在该条件变量上等待的时候才能注销这个条件变量,否则返回EBUSY。
因为Linux实现的条件变量没有分配什么资源,所以注销动作只包括检查是否有等待线程。
说明:thread:线程标识符;
attr:线程属性设置;
start_routine:线程函数的起始地址;
arg:传递给start_routine的参数;
返回值:成功,返回0;出错,返回-1。
int pthread_join(pthread_t thread, void **value_ptr);
说明:thread:等待退出线程的线程号。
value_ptr:退出线程的返回值。
使一个线程等待另一个线程结束后,再往下执行。
使用流程
OK,以上就差不多这么多基础知识,下面直接是代码:
以上参考 : http://www.cnblogs.com/secondtonone1/p/5580203.html
谢谢这位作者。
常用的方法有:
pthread_mutex_t mutex;//互斥锁 pthread_cond_t cond;//条件变量 pthread_mutex_init(&mutex, NULL); pthread_mutex_lock(&mutex); pthread_mutex_trylock(&mutex) pthread_mutex_unlock(&mutex); pthread_mutex_destroy(&mutex); pthread_cond_init(&cond, NULL); pthread_cond_wait(&cond,&mutex); pthread_cond_signal(&cond); pthread_cond_broadcast(&cond); pthread_cond_timedwait(&cond, &mutex, &ts); pthread_cond_destroy(&cond); pthread_t native_thread; pthread_create(&native_thread, NULL, thread_func,NULL); pthread_join(native_thread, NULL)
大体上就是这么多方法。下面说一下这些方法的作用;
1、互斥锁mutex
(1)初始化有两种初始化方式:静态、动态;
静态方式:static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
动态方式:(1)可以使用new或者malloc一个pthread_mutex_t 类型变量,用完后记得delete或者free掉。
(2)调用pthread_mutex_init(&mutex, NULL);即可;第一个参数表示互斥锁变量,第二个参数表示互斥锁属性。成功的话返回0
(2)加锁、解锁、测试加锁
pthread_mutex_lock(&mutex);加锁
pthread_mutex_trylock(&mutex);//尝试加锁,不常用,和第一个差不多
pthread_mutex_unlock(&mutex);//解锁
不论哪种类型的锁,都不可能被两个不同的线程同时得到,而必须等待解锁。
(3)销毁互斥锁
pthread_mutex_destroy(&mutex);执行成功返回0;
2、条件变量
pthread_cond_t表示多线程的条件变量,用于控制线程等待和就绪的条件。(1)初始化
同样,和互斥锁一样,也有两种初始化方法;
静态方式:static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
动态方式:(1)可以使用new或者malloc一个pthread_cond_t类型变量,用完后记得delete或者free掉。
(2)调用pthread_cond_init(&cond, NULL);即可;第一个参数表示互斥锁变量,第二个参数表示互斥锁属性。成功的话返回0;
(2)等待和触发
等待
pthread_cond_wait(&cond,&mutex);//条件等待等
4000
待
pthread_cond_signal(&cond);//
pthread_cond_broadcast(&cond);
pthread_cond_timedwait(&cond, &mutex, &ts);//时间等待
无论哪种等待方式,都必须和一个互斥锁配合,以防止多个线程同时请求pthread_cond_wait()(或pthread_cond_timedwait())
的竞争条件(Race Condition);用法如下:
pthread _mutex_lock(&mutex) while或if(线程执行的条件是否成立) pthread_cond_wait(&cond, &mutex); 线程执行..... pthread_mutex_unlock(&mutex);
触发
激发条件有两种形式,pthread_cond_signal()激活一个等待该条件的线程,存在多个等待线程时按入队顺序激活其中一个;
而pthread_cond_broadcast()则激活所有等待线程。
(3)销毁
pthread_cond_destroy(&cond);
只有在没有线程在该条件变量上等待的时候才能注销这个条件变量,否则返回EBUSY。
因为Linux实现的条件变量没有分配什么资源,所以注销动作只包括检查是否有等待线程。
3、开启线程
int pthread_create((pthread_t thread, pthread_attr_t *attr, void (start_routine)(void ), void *arg)说明:thread:线程标识符;
attr:线程属性设置;
start_routine:线程函数的起始地址;
arg:传递给start_routine的参数;
返回值:成功,返回0;出错,返回-1。
int pthread_join(pthread_t thread, void **value_ptr);
说明:thread:等待退出线程的线程号。
value_ptr:退出线程的返回值。
使一个线程等待另一个线程结束后,再往下执行。
使用流程
等待线程: pthread_mutex_lock(&mutex); if(条件不满足) pthread_cond_wait(&cond, &mutex); //处理共享资源 pthread_mutex_unlock(&mutex); 激活线程: pthread_mutex_lock(&mutex); pthread_cond_signal(&cond); pthread_mutex_unlock(&mutex);
OK,以上就差不多这么多基础知识,下面直接是代码:
#include <pthread.h> #include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <iostream> using namespace std; int count = 0; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond = PTHREAD_COND_INITIALIZER; //该函数增加count数值 void * creator(void * arg) { cout << "creator add lock" << endl; pthread_mutex_lock(&mutex); count ++; cout << "in creator count is : " << count << endl; //条件满足时发送信号 if(count > 0) { pthread_cond_signal(&cond); } cout << "creator release lock" << endl; pthread_mutex_unlock(&mutex); return NULL; } //该函数减少count数值 void * consumer(void * arg) { cout << "consumer add lock" << endl; pthread_mutex_lock(&mutex); //当条件不满足时等待 if(count <= 0) { cout << "begin wait" << endl; pthread_cond_wait(&cond,&mutex); cout << "end wait" << endl; } count --; cout << "in consumer count is " << count << endl; pthread_mutex_unlock(&mutex); cout << "consumer release lock" << endl; return NULL; } int main() { //两个线程,一个生产者线程一个消费者线程 pthread_t createthread,consumethread; pthread_create(&consumethread, NULL, consumer, NULL); sleep(2); pthread_create(&createthread, NULL, creator, NULL); //主进程等待两个线程结束 pthread_join(createthread, NULL); pthread_join(consumethread, NULL); return 0; }
以上参考 : http://www.cnblogs.com/secondtonone1/p/5580203.html
谢谢这位作者。
相关文章推荐
- JNI多个线程中使用 android开发教程
- Android 开发中JNI的使用总结
- Android高手进阶教程(十九)之---Android开发中,使用线程应该注意的问题!
- 【Android开发】线程间通讯机制(基础篇)——Handler、Runnable、HandlerThread、AsyncTask的使用
- Android Jni中使用线程及回调更新UI
- Android高手进阶教程(十九)之---Android开发中,使用线程应该注意的问题!
- Android开发中,使用线程应该注意的问题!
- android 开发配置及jni使用总结
- Android高手进阶教程(十九)之---Android开发中,使用线程应该注意的问题!
- 【基于Windows系统】教你如何在Android中使用JNI以及NDK开发环境搭建
- Android开发中,使用线程应该注意的问题!
- Android高手进阶教程(十九)之---Android开发中,使用线程应该注意的问题!
- 使用JNI开发Android应用
- android开发教程之使用线程实现视图平滑滚动示例
- -Android开发中,使用线程应该注意的问题!
- eclipse android开发环境 bug CDT包含路径名无法修改(JNI开发使用)
- Android高手进阶教程(十八)---Android开发中,使用线程应该注意的问题!