一、
當乙個程式開啟時,系統就自動為程式建立了乙個主線程,在主線程中,所有的操作都是同步執行的
所以有可能造成「介面假死」,因為當在主線程裡執行計較耗時的操作是,主線程需要等待操作的完成,比如乙個
uibutton的監聽事件裡面寫了乙個死迴圈 while(1);,這個時候整個介面就死掉了,程式不能夠幾時的處理user
的其他觸控事件,就造成了「介面假死」的現象,好的解決方案就是把這個死迴圈放到新的執行緒中--工作執行緒,這樣就
不會影響主線程對其他控制項的事件響應處理。
建立乙個新執行緒需要使用nsthread,
建立乙個匿名執行緒,注意,這個執行緒在建立好之後就會立馬被啟動--執行selector裡面的方法
裡面的第乙個引數就是需要執行的函式,第二個函式就是選擇讓誰負責呼叫這個函式,第三個引數是向函式傳遞乙個物件
[nsthread detachnewthreadselector:@selector(threadmain:) totarget:self withobject:nil];
建立乙個非匿名的執行緒需要手動啟動--
nsthread
*thread = [[
nsthread
alloc
] initwithtarget
:self
selector
:@selector
(customthread:)
object
:self];
啟動執行緒
[thread start];
值得注意的是,當建立兩個執行緒的時候就有一些東西需要指出:資源競爭導致的「死鎖」,
執行緒的執行是非同步的,所有可能會發生兩個執行緒同時使用乙個公共資源,如果這種情況發生
就會發生意想不到的事情,這個具體是什麼情況,還是請各位度娘去
解決方法就是讓執行緒對公共資源加鎖:nslock,
nslock的物件就是一把「鎖」,如果有以公共資源:nsstring *share;
[mylock lock];
share++;
[mylock unlock];
執行緒b使用的時候也需要這樣做,這樣在a使用的時候cpu就會掛起b,
當然還有一種方式是在根源上解決問題,比如
@property(atomic,copy)nsstring
使用「atomic」,執行緒保護,跟lock具有相同的效果,所以就不必擔心在被兩個以上的執行緒使用的時候發生「資源競爭」的情況了。
比如更改乙個uilabel的text屬性,,這是行不通的,必須在主線程中更改,
把操作放在sel中即可,
【self performselectoronmainthread:(sel)aselector withobject:(id)arg waituntildone:(bool)wait】;
二:建立執行緒池:
建立執行緒池有兩種方式,第一種是oc得方式,第二種是c語言的方式。
oc版:
oc建立執行緒池的關鍵字是:nsoperationqueue
oc執行緒池的單元是nsinvocationoperation物件,
- (void)creatthreadqueue_oc
c語言建立乙個執行緒池,c語言執行緒的單元式「**塊」--block
- (void)creatthreadqueue_c);
工作執行緒都不能夠操作ui元件的顯示方式,必須放在主線程中去操作
dispatch_sync(dispatch_get_main_queue(), ^);
}
執行緒 執行緒池
執行緒池是一種多執行緒處理形式,處理過程中將任務新增到佇列,然後在建立執行緒後執行,主要實現 建立執行緒和管理執行緒,並且給執行緒分配任務。執行緒池中的執行緒是併發執行的。乙個比較簡單的執行緒池至少應包含執行緒池管理器 工作執行緒 任務列隊 任務介面等部分。其中執行緒池管理器的作用是建立 銷毀並管理...
執行緒 執行緒池
乙個簡單執行緒的建立和銷毀如下 與程序程序相比,執行緒是一種輕量級的工具,但是輕量並不代表沒有,它的建立和關閉依然需要花費時間,如果建立和銷毀的時間還大於執行緒本身完成的工作,那就會得不償失,甚至會造成out of memory。即使沒有,大量的執行緒 也會給gc帶來巨大的壓力。為了解決這樣的問題,...
mysql 執行緒池 c MySQL執行緒池
mysql執行緒池 在麼mysql中,執行緒池指的是用來管理處理mysql客戶端連線任務的執行緒的一種機制。如果把執行緒看做系統資源那麼執行緒池本質上是對系統資源的管理,對應作業系統來說執行緒的建立和銷毀是比較消耗系統資源的,頻繁的建立與銷毀執行緒必然給系統帶來不必要的資源浪費,特別是在高負載的情況...