注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

android的线程封装基类Thread  

2012-04-19 22:51:43|  分类: 深入研究 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
本文转载整理自:
http://blog.csdn.net/beeboobeeboo/article/details/6617134 
http://hi.baidu.com/%B6%C5%B2%FD%B1%F2/ 
首先Anroid提供了几个与直接创建线程的函数:
inline bool createThread(thread_func_t f, void *a)  
inline bool createThreadEtc(thread_func_t entryFunction,
                            void *userData,
                            const char* threadName = "android:unnamed_thread",
                            int32_t threadPriority = PRIORITY_DEFAULT,
                            size_t threadStackSize = 0,
                            thread_id_t *threadId = 0)
inline thread_id_t getThreadId()
Android对Linux线程提供了C++封装Thread类,它是线程的基类。 在实际使用的过程中都 需创建一个新类继承于Thread类,并实现threadLoop()方法,它即是线程函数。要启动线程,调用run()函数即可。
 /*
 * Android线程封装的基类
 */
class Thread : virtual public RefBase
{
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();

                        /* 可以重载此虚函数以进行初始化工作,但必须显示调用 */
                        virtual status_t    readyToRun();
    
                        /* 要求线程退出(同步的) */
                        status_t    requestExitAndWait();

protected:
                        /* 判断requestExit()是否被调用过 */
                        bool        exitPending() const;
    
private:
                        /* 线程执行函数。
                       *若此函数返回true,当requestExit()没被调用时,会再次调用此函数;
                        *若返回false,
                        * 在该函数返回时线程将退出
                        */
                        virtual bool        threadLoop() = 0;

private:
                        Thread& operator=(const Thread&);
                        static  int             _threadLoop(void* user);
                        const   bool            mCanCallJava;
                        thread_id_t     mThread;
                        Mutex           mLock;
                        Condition       mThreadExitedCondition;
                        status_t        mStatus;
                        volatile bool           mExitPending;
                         volatile bool           mRunning;
                        sp<Thread>      mHoldSelf;
#if HAVE_ANDROID_OS
                        int             mTid;
#endif
};
首先Thread继承自RefBase类,一般在使用的时候要实现onFirstRef()这个父类函数,一般经典 的用法是在里面运行Thread的run函数,这样在创建thread的实例 的时候就开始运行这个线程了。当然也可以不在这里执行run()函数,在其他地方执行run()函数启动这个线程。   
virtual status_t    run(    const char* name = 0,
                                int32_t priority = PRIORITY_DEFAULT,
                                size_t stack = 0);

创建一个thread实例的时候,线程并没有运行,只有在执行run()函数的时候,线程才开始真正的开始运行。
virtual status_t    readyToRun();
这个函数定义thread执行前的初始化工作
virtual bool        threadLoop() = 0;
这个函数是每个线程类都要实现的,在这里定义thread的执行内容,这个函数如果返回true,则函数会不停地执行threadloop中的内容,如果 这个函数返回false,则threadloop中的内容仅仅执行一次线程就会退出。

下面看看Android的mutex,基本和posix的mutex很像,唯一增加了一个Mutex::Autolock,这个自动锁用得是比较多的,在 作用域里加锁,脱离作用域就会自动解锁。
class Autolock {
    public:
        inline Autolock(Mutex& mutex) : mpMutex(&mutex) { mutex.lock(); }
        inline Autolock(Mutex* mutex) : mpMutex(mutex) { mutex->lock(); }
        inline ~Autolock() { mpMutex->unlock(); }

    private:
        Mutex*  mpMutex;
    };
再看看Andorid的Condition,用法基本和posix差不多,因为本身是条件变量所以只有一个mutex参数~~

  评论这张
 
阅读(1443)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017