Android 多線程實(shí)現(xiàn)重復(fù)啟動與停止的服務(wù)
Android 多線程實(shí)現(xiàn)重復(fù)啟動與停止的服務(wù)
多線程環(huán)境下為了避免死鎖,一般提倡開放調(diào)用,開放調(diào)用可以避免死鎖,它的代價(jià)是失去原子性。但是在有些時(shí)候會顯得邏輯錯(cuò)誤,
例如:
class A{ private boolean mIsStarted; void start(){ boolean changed = false; synchronized(this){ if(!mIsStarted){ mIsStarted = true; changed = false; } if(changed){ callBack.onStart(); } } } boolean isStarted(){ sychronized(this){ return mIstarted; } } void stop(){ boolean changed = false; synchronized(this){ if(mStarted){ mStarted = false; changed = true; } } if(changed){ callBack.onStop(); } } }
在單線程環(huán)境下這個(gè)代碼沒有任何問題??墒窃诙嗑€程環(huán)境就會出現(xiàn)奇怪的現(xiàn)象。
原則上講, onStart 一定要走在onStop前面,可事實(shí)并非如此:
執(zhí)行步驟如下:
線程1 start
線程2 stop
線程1
if(!mIsStarted){ mIsStarted = true; changed = false; }
線程2
synchronized(this){ if(mStarted){ mStarted = false; changed = true; } }
線程2 onStop
線程1 onStart
現(xiàn)在onStop 走在了onStart前面。那么問題來了,如何才能保證onStart 一定在onStop前面呢?
那么問題又來了,stop 方法為什么不允許在start之前調(diào)用呢?如果一個(gè)類不可restart,那么stop是可以在start之前的,否則是不可以在start之前的。
以上就是Android 多線程實(shí)現(xiàn)重復(fù)啟動與停止的服務(wù)的講解,如有疑問請留言或者到本站社區(qū)交流討論,感謝 閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Android UI自定義ListView實(shí)現(xiàn)下拉刷新和加載更多效果
這篇文章主要介紹了Android UI自定義ListView實(shí)現(xiàn)下拉刷新和加載更多效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android實(shí)現(xiàn)3D標(biāo)簽云效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)3D標(biāo)簽云效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05輕松實(shí)現(xiàn)Android仿淘寶地區(qū)選擇功能
這篇文章主要介紹了輕松實(shí)現(xiàn)Android仿淘寶地區(qū)選擇功能的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06Android?Studio實(shí)現(xiàn)簡易計(jì)算器源碼
這篇文章主要為大家詳細(xì)介紹了Android?Studio實(shí)現(xiàn)簡易計(jì)算器源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05Android超實(shí)用的Toast提示框優(yōu)化分享
Toast是Android中用來顯示顯示信息的一種機(jī)制,和Dialog不一樣的是,Toast是沒有焦點(diǎn)的,而且Toast顯示的時(shí)間有限,過一定的時(shí)間就會自動消失。那么這篇文章跟大家分享下Android中Toast的優(yōu)化,對大家日常開發(fā)還是很實(shí)用,下面來一起看看吧。2016-09-09