版权声明:本文为卫伟学习总结文章,转载请注明出处!
Android是基于Linux内核的,而Linux是遵循POSIX线程标准的,POSIX线程库中有一系列Pthreads API方便我们对Linux线程的操作。所以在Android中使用C/C++线程也就转到了使用POSIX线程库。他们都在头文件"pthread.h"中。
一、创建子线程
1.pthread_t:用来声明一个线程对象如:pthread_t thread;
2.pthread_create:用来创建一个实际的线程如:pthread_create(&pthread,NULL,threadCallBack,NULL);其总共接收4个参数,第一个参数为pthread_t对象,第二个参数为线程的一些属性,一般传NULL。第三个参数为线程执行的函数(void * threadCallBack(void *data),第四个参数为传递给线程的参数是void *类型的,即可以传任意类型。
3.pthread_exit:用于退出线程如:pthread_exit(&thread),参数也可以传NULL。注:线程回调函数最后必须调用此方法,不然APP会退出(挂掉)。

pthread_t  thread;void *normalCallBack(void * data) {    LOGI("create normal thread from c++!");    pthread_exit(&thread);}extern  "C"JNIEXPORT void JNICALLJava_com_day1_jado_mymusic_ThreadDemo_normalThread(JNIEnv *env, jobject instance) {    // TODO    pthread_create(&thread, NULL, normalCallBack,NULL);}

二、生成者和消费者模型
1.pthread_mutex_t:用于创建线程锁对象如:pthread_mutex_t mutex;
2.pthread_mutex_init:用于初始化pthread_mutex_t锁对象如:pthread_mutex_init(&mutex,NULL);
3.pthread_mutex_destroy:用于销毁pthread_mutex_t锁对象如:pthread_mutex_destroy(&mutex);
4.pthread_mutex_cond_t:用于创建线程条件对象如:pthread_cond_t cond;
5.pthread_cond_init:用于初始化pthread_cond_t条件对象如:pthread_cond_init(&cond,NULL);
6.pthread_cond_destroy:用于销毁pthread_cond_t条件对象如:pthread_cond_destroy(&cond);
7.pthread_mutex_lock:用于上锁mutex,本线程上锁后的其他变量是不能被别的线程操作的如:pthread_mutex_lock(&mutex);
8.pthread_mutex_unlock:用于解锁mutex,解锁后的其他变量可以被其他线程操作如:pthread_mutex_unlock(&mutex);
9.pthread_cond_signal:用于发出条件信号如:pthread_cond_signal(&mutex,&cond);
10.pthread_cond_wait:用于线程阻塞等待,直到pthread_cond_signalfaculty条件信号后才执行退出线程阻塞执行后面的操作。

#include "queue"#include "unistd.h"pthread_t produc;pthread_t custom;pthread_mutex_t mutex;pthread_cond_t cond;std::queue queue;void *producCallback(void *data) {while(1) {    pthread_mutex_lock(&mutex);    queue.push(1);    LOGI("生产者生产一个产品,通知消费者消费, 产品数量为 %d", queue.size());    pthread_cond_signal(&cond);    pthread_mutex_unlock(&mutex);    sleep(5);}pthread_exit(&produc);}void *customCallback(void *data) {while(1) {    pthread_mutex_lock(&mutex);    if(queue.size() > 0) {        queue.pop();        LOGI("消费者消费产品,产品数量还剩余 %d ", queue.size());    } else {        LOGI("没有产品可以消费, 等待中...");        pthread_cond_wait(&cond, &mutex);    }    pthread_mutex_unlock(&mutex);    usleep(500 * 1000);}pthread_exit(&custom);}extern "C"JNIEXPORT void JNICALLJava_com_day1_jado_mymusic_ThreadDemo_mutexThread(JNIEnv *env, jobject instance) {for(int i = 0; i < 10; i++) {    queue.push(i);}pthread_mutex_init(&mutex,NULL);pthread_cond_init(&cond, NULL);pthread_create(&produc, NULL, producCallback, NULL);pthread_create(&custom,NULL, customCallback, NULL);}

更多相关文章

  1. android之多线程工作(一)AsyncTask .
  2. 软引用、弱引用和虚引用处理
  3. Android(安卓)获取屏幕高度、标题高度、状态栏高度详解
  4. Android实现音乐的播放与停止(Service的初级应用)
  5. Android涉及到的设计模式
  6. Android(安卓)日历提供器(三)
  7. Android(安卓)Adapter适配器模板(笔记)
  8. Java简单模拟Android中Handler-Message机制
  9. Android(安卓)分析内存的使用情况

随机推荐

  1. Android_ UEventObserver_监听USB插拔
  2. RelativeLayout相对布局方法总结
  3. POCO C++库在Android(安卓)平台上集成(3)
  4. android 之MediaPlayer播放音频与SoundPo
  5. Android 技巧 - listview 里面的图片不能
  6. Android 可响应drawable点击事件的TextVi
  7. Android 2012年9月19日_001
  8. Android 去掉标题栏,状态栏,导航栏
  9. 代码:android崩溃日志收集和处理
  10. 要闻:Google + Motorola