Android 中 C++ Thread线程用法(五十七)

2024-05-08 01:08

本文主要是介绍Android 中 C++ Thread线程用法(五十七),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 1、Android把线程C++封装Thread类,它是线程的基类

 2、使用Thread时,创建一个类继承于Thread类,实现threadLoop()方法是纯虚函数,在子类中实现

 3、启动线程,调用run()函数

class Thread : virtual public RefBase//RefBase封装sp、wp智能指针
{
public:
                        Thread(bool canCallJava = true);
                        virtual             ~Thread();

                         // 启动线程,创建一个新的线程并执行threadLoop()虚函数 

                         virtual status_t    run( const char* name = 0, int32_t priority = PRIORITY_DEFAULT,size_t stack = 0);

                         //退出线程函数(异步) 
                        virtual void        requestExit();

                       /*readyToRun()在Android4.4版本 system/core/libutils/Threads.cpp,

                         在run()函数里的_threadLoop()方法被调用self->readyToRun();初始化线程,

                         之后调用result = self->threadLoop();真正启动线程 */

                        // 可重载此虚函数进行初始化工作,为隐式调用
                        virtual status_t    readyToRun();
    
                       //线程退出(同步)
                        status_t    requestExitAndWait();
protected:
                        // 判断requestExit()是否被调用过 
                        bool        exitPending() const;
    
private:

                        // 线程函数。若此函数返回true,当requestExit()没被调用过时会再次调用此函数;若返回false,
                         在该函数返回时线程将退出

                        virtual bool        threadLoop() = 0;//纯虚函数,在子类中实现

};

举例:

Thread类继承于ReBase虛基类,new一个sp的模板类,会最终调用该类对象对Refbase重载的onFirstRef();
  例如: sp<MainThread> mMainThread; //成员变量;智能指针sp<char> == char *等价
      mMainThread = newMainThread();//new 一个sp的模板类赋值给成员变量mMainThread
     虛基类Refbase()中的onFirstRef()方法被调用,此时run()反方发被调用,线程启动,调用threadLoop()不停循环执行。

class MainThread : public Thread {
public:
    MainThread();
    virtual  ~MainThread();
    virtual void onFirstRef() 

    {

        run("MainThread", PRIORITY_DEFAULT);
    }
    virtual status_t  readyToRun();
    virtual bool threadLoop();
    virtual void     requestExit();
    void requestLock();

private:
    sp<MainThread> mMainThread;
  
};

这篇关于Android 中 C++ Thread线程用法(五十七)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968893

相关文章

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

oracle中exists和not exists用法举例详解

《oracle中exists和notexists用法举例详解》:本文主要介绍oracle中exists和notexists用法的相关资料,EXISTS用于检测子查询是否返回任何行,而NOTE... 目录基本概念:举例语法pub_name总结 exists (sql 返回结果集为真)not exists (s

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

C语言线程池的常见实现方式详解

《C语言线程池的常见实现方式详解》本文介绍了如何使用C语言实现一个基本的线程池,线程池的实现包括工作线程、任务队列、任务调度、线程池的初始化、任务添加、销毁等步骤,感兴趣的朋友跟随小编一起看看吧... 目录1. 线程池的基本结构2. 线程池的实现步骤3. 线程池的核心数据结构4. 线程池的详细实现4.1 初

在 VSCode 中配置 C++ 开发环境的详细教程

《在VSCode中配置C++开发环境的详细教程》本文详细介绍了如何在VisualStudioCode(VSCode)中配置C++开发环境,包括安装必要的工具、配置编译器、设置调试环境等步骤,通... 目录如何在 VSCode 中配置 C++ 开发环境:详细教程1. 什么是 VSCode?2. 安装 VSCo

Springboot中Jackson用法详解

《Springboot中Jackson用法详解》Springboot自带默认json解析Jackson,可以在不引入其他json解析包情况下,解析json字段,下面我们就来聊聊Springboot中J... 目录前言Jackson用法将对象解析为json字符串将json解析为对象将json文件转换为json

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)

Android WebView的加载超时处理方案

《AndroidWebView的加载超时处理方案》在Android开发中,WebView是一个常用的组件,用于在应用中嵌入网页,然而,当网络状况不佳或页面加载过慢时,用户可能会遇到加载超时的问题,本... 目录引言一、WebView加载超时的原因二、加载超时处理方案1. 使用Handler和Timer进行超