您的位置:首页 > 编程语言 > C语言/C++

Android 中 C++ Thread线程用法

2017-08-14 19:50 3719 查看
 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;

  

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: