IOS RUNLOOP NSTHREAD NSOPERationQueue

NSThread

使用NSThead創建線程有很多方法:

  • +detachNewThreadSelector:toTarget:withObject:類方法直接生成一個子線程
1
[NSThread detachNewThreadSelector:@selector(threadRoutine:) toTarget:self withObject:nil];
  • 創建一個NSThread類實例,然後調用start方法。
1
2
NSThread* aThread = [[NSThread alloc] initWithTarget:self selector:@selector(threadRoutine:) object:nil];
[aThread start];
  • 調用NSObject的+performSelectorInBackground:withObject:方法生成子線程。
1
[myObj performSelectorInBackground:@selector(threadRoutine:) withObject:nil];
  • 創建一個NSThread子類,然後調用子類實例的start方法,。

創建線程也是有開銷的,iOS下主要成本包括構造內核數據結構(大約1KB)、棧空間(子線程512KB、主線程1MB,不過可以使用方法-setStackSize:自己設置,注意必須是4K的倍數,而且最小是16K),創建線程大約需要90毫秒的創建時間。

第二種和第四種方法創建的線程有個好處是擁有線程的對象,因此可以使用performSelector:onThread:withObject:waitUntilDone:在該線程上執行方法,這是一種非常方便的線程間通訊的方法(相對於設置麻煩的NSPort用於通訊),所要執行的方法可以直接添加到目標線程的Runloop中執行。Apple建議使用這個接口運行的方法不要是耗時或者頻繁的操作,以免子線程的負載過重。

第三種方法其實與第一種方法是一樣的,都會直接生成一個子線程。

上面四種方法生成的子線程都是detached狀態,即主線程結束時這些線程都會被直接殺死;如果要生成joinable狀態的子線程,只能使用pthread接口啦。

如果需要,可以設置線程的優先級(-setThreadPriority:);如果要在線程中保存一些狀態信息,還可以使用到-threadDictionary得到一個NSMutableDictionary,以key-value的方式保存信息用於線程內讀寫。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章