Android Native Thread分析

本文介绍了Android Native Thread,它是对pthread的封装,提供了一套方便使用的接口。Thread类需要子类实现threadLoop()方法来定义线程逻辑。使用包括直接继承Thread并调用run(),或通过组合方式复用Thread,如MessageThread类的例子所示,业务逻辑只需实现特定接口即可接入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android Native Thread是对pthread线程的封装,提供了封装化的接口(sp指针,抽象接口),方便应用程序使用。具体接口如下:

class Thread : virtual public RefBase    // virtual继承,多重继承时能保证只有一个RefBase
{
public:
                        Thread(bool canCallJava = true);  // 构造函数,不会开始线程的执行,直到调用run函数
    virtual             ~Thread();

    
    // 这是个模板方法,定义顶层实现逻辑,需要子类实现threadLoop()来完成整个逻辑
    virtual status_t    run(    const char* name = 0,
                                int32_t priority = PRIORITY_DEFAULT,
                                size_t stack = 0);
    
    // 请求线程推出,可以在其他的线程中调用,这是个异步调用方法,线程不一定已经真正退出了
    virtual void        requestExit();


    //线程运行前的一次性初始化工作
    virtual status_t    readyToRun();
    
    // 请求线程退出,等待直到线程真正退出,不要在当前线程上下文中调用,否则会返回WOULD_BLOCK
    status_t    requestExitAndWait();

    // 等待直到线程退出,不要在当前线程上下文中调用,否则会返回WOULD_BLOCK
    status_t    join();

    // 线程是否运行
    bool        isRunning() const;

    //返回线程ID, 与线程自身调用gettid()或者 androidGetTid()得到的值相同
    pid_t       getTid() const;

protected:
    // 是否请求退出状态
    bool        exitPending() const;
    
private:
    // 子类必须实现 threadLoop(). 如果threadLoop返回true,将会重复调用,直到requestExit请求;threadLoop返回false,线程将退出
    virtual bool        threadLoop() = 0;

private:
    static  int             _threadLoop(void* user);  //静态函数,传递给pthread_create的执行例程,这个函数调用threadLoop
    const   bool            mCanCallJava;  //java能够调用
    thread_id_t     mThread;    //thread_id_t类型的ID
    mutable Mutex           mLock;   //同步锁
    Condition       mThreadExitedCondition;  //条件变量,用于线程退出的状态同步
    status_t        mStatus; //运行状态
    volatile bool           mExitPending;  //是否请求退出
    volatile bool           mRunning;  //线程是否已经调用run开始执行
    sp<Thread>      mHoldSelf;      //自身对象的强引用
    pid_t           mTid;   //当前线程ID}

}

下面看看Thread的使用:

1)子类继承Thread,需要实现threadLoop,之后显示调用Thread::run()来执行线程上下文。也可以override onFirstRef()调用run, 利用sp第一次调用OnfirstRef自动启动线程。

2) 通过对象组合的方式复用Thread, 好处是避免类的多重继承, 对Thread对象生命周期控制比较容易。需要一个handler接口和Thread子类来对接口的包装。

/* Abstraction of MessageThread */
class IMessageHandler
{
public:
    virtual ~IMessageHandler() { };
    virtual void messageThreadLoop(void) = 0;
};

class MessageThread : public Thread {
public:
    MessageThread(IMessageHandler* runner) { }
    virtual void onFirstRef() {
        run(mName, mPriority);
    }
    virtual bool threadLoop() {
        mRunner->messageThreadLoop();
        return false;
    };
private:
    IMessageHandler* mRunner;
    String8 mName;
    int mPriority;
};

第三方的业务逻辑类,只需要实现messageThreadLoop接口,并将MessageThread对象组合到业务类,就可以完全复用Thread,并且完全控制Thread的生命周期。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值