線程

来源:http://www.cnblogs.com/Mr-Lin/archive/2016/01/30/5172299.html
-Advertisement-
Play Games

線程問題我會分成三篇文章來給大家做個詳細的講解 一、線程的概念 1.線程是進程的組成部分,一個進程可以擁有多個線程,一個線程必須有一個父線程; 2.線程擁有自己的堆棧、自己的程式計數器和自己的局部變數,但不再擁有系統資源,它與父線程中的其他線程共用該進程所擁有的全部資源 3.線程是獨立運行的,它並不


線程問題我會分成三篇文章來給大家做個詳細的講解

一、線程的概念

1.線程是進程的組成部分,一個進程可以擁有多個線程,一個線程必須有一個父線程;

2.線程擁有自己的堆棧、自己的程式計數器和自己的局部變數,但不再擁有系統資源,它與父線程中的其他線程共用該進程所擁有的全部資源

3.線程是獨立運行的,它並不知道進程中是否還有其他線程存在,線程的執行是搶占式的,也就是說當前的運行的線程在任何時候都可能被掛起,以便另外一個線程可以運行。

使用多線程編程的優點

1、進程間不能共用記憶體,但線程之間共用記憶體非常容易

2、系統創建進程需要重新為該進程分配資源,但是創建線程則代價小得多,因為它與父線程中的其他線程共用該進程所擁有的全部資源

3、處理非同步任務的主要手段,可防止UI界面假死

線程的創建方法:

1)創建線程並執行線程

+ (void)detachNewThreadSelector: toTarget: withObject:

 

2)創建一個線程並返回一個線程對象但是不會執行,需要手動調用start

- (instancetype)initWithTarget: selector: object:

 

 

二、線程的狀態

1、當程式創建了一個線程後,該程式就處於新建狀態,此時它與其他OC對象一樣,僅僅由系統為其分配了記憶體,並初始化了其成員變數的值,此時的線程對象沒有表現任何線程的動態特征,程式也不會執行線程的線程執行體

2、當線程對象調用了start方法之後,該線程處於就緒狀態,系統會為其調用方法調用棧和程式計數器,處於這種狀態的線程並沒有開始運行,他只是表示該線程可以運行了,至於線程何時開始運行,取決於系統的調度;倘若希望調用子線程的start方法之後子線程立即開始執行,可以在程式中加上

[NSThread sleepForTimeInterval:0.001];   //寫在哪個線程中代表哪個線程

讓當前運行的線程睡眠一毫秒,因為在這一毫秒內CPU不會空閑,他會去執行另一個處於就緒狀態的線程,這就可以讓子線程立即獲得執行

 

三、終止子線程

線程會以以下三種方式之一結束,結束之後就處於死亡狀態

1、線程執行體方法執行完成,線程正常結束

2、線程執行過程中出現了錯誤

3、直接調用NSThread類的exit方法來終止當前正在執行的線程

對象方法

isExecuting、isFinishing判斷線程當前是否處於執行狀態或者執行完成狀態

如果希望在主線程中終止子線程,NSThread並沒有提供方法來終止某個子線程,為了在子線程中終止子線程,可以向子線程發送一個信號(比如調用子線程的cancel方法),然後在子線程的線程執行體重進行判斷,如果子線程收到過終止信號,程式應該調用NSThread類的exit方法來終止當前正在執行的迴圈

 

四、線程睡眠

如果需要讓當前正在執行的線程暫停一段時間,併進入阻塞狀態,則可以通過調用NSThread類的sleepXXX類方法來完成

+ (void)sleepForTimeInterval:(NSTimeInterval)ti;    //每隔多久執行一次 

+ (void)sleepUntilDate:(NSDate *)date;     //指定睡眠指導某個時間執行

 

 1 - (void)viewDidLoad {
 2     [super viewDidLoad];
 3     // NSThread 兩種創建線程的方式
 4 #if 1
 5     //1.該方法創建的線程需要手動調用啟動,才會去執行線程指定的方法
 6     // 線程需要一個函數作為線程的入口函數,這個函數稱為線程的入口函數
 7     //  線程主要用來做併發操作,例如執行耗時的代碼
 8    NSThread *tread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething) object:nil];
 9     for (int i = 0; i < 100; i++) {
10         if (i == 20) {  
11             //需要手動執行開始,才會調用doSomething的方法
12             [tread start];
13             [NSThread sleepForTimeInterval:0.001];
14         }
15         NSLog(@"%d",i);
16     }
17     //給線程取別名
18     //tread.name = @"something";
19 
20 #elif 0
21     //2.該方式創建的線程會自動執行線程的入口函數
22     [NSThread detachNewThreadSelector:@selector(doSomething) toTarget:self withObject:nil];
23   #endif
24 }
25 -(void)doSomething
26 {
27     // 耗時代碼
28     
29     // 獲取當前線程
30     //NSLog(@"%@",[NSThread currentThread]);
31     int index = 10;
32     
33     while (index--) {
34         
35         if (index == 5) {
36             //1⃣️cancel 取消線程,並不是真正意義上的取消線程,是給線程打上取消的標誌,等待取消
37             [[NSThread currentThread] cancel];
38         }
39         
40         //2⃣️.判斷線程是否有取消的標誌
41         if ([[NSThread currentThread] isCancelled]) {
42             //3⃣️.退出線程,線程銷毀,系統會自動回收資源
43             //[NSThread exit];
44             //註意return與退出線程的區別
45             //return;
46         }
47         
48         NSLog(@"%d",index);
49         //兩種睡眠方式
50         //1.睡眠
51         //[NSThread sleepForTimeInterval:1];
52         //2.指定睡眠知道某個時間執行
53         //dateByAddingTimeInterval 追加的時間
54 //        NSDate *curDate = [[NSDate date] dateByAddingTimeInterval:1];
55 //        [NSThread sleepUntilDate:curDate];
56     }
57 }

 

【註意】iOS規定只能在UI線程(即主線程)中修改UI控制項的屬性,因為如果程式允許任意子線程訪問、修改UI控制項的屬性,這就需要對多個新線程的併發訪問進行同步控制;否則,多個線程將會破壞UI控制項內部狀態的完整性

實例:下載網路圖片(如果程式在UI線程中訪問網路數據,由於網路速度的不確定性,當網路傳輸速度比較慢時,UI線程就會被阻塞,從而導致應用失去響應,因此程式將通過網路下載圖片的操作放在多線程中完成)

 1 #import "ViewController.h"
 2 
 3 @interface ViewController ()
 4 @property (weak, nonatomic) IBOutlet UIImageView *imageV;
 5 
 6 @end
 7 
 8 @implementation ViewController
 9 
10 - (void)viewDidLoad {
11     [super viewDidLoad];
12     
13 }
14 - (IBAction)BtnAction:(id)sender {
15     //圖片地址
16     NSString *url = @"http://image.baidu.com/search/down?tn=download&ipn=dwnl&word=download&ie=utf8&fr=result&url=http%3A%2F%2Fh.hiphotos.baidu.com%2Fzhidao%2Fwh%253D450%252C600%2Fsign%3D3dc4538262d0f703e6e79dd83dca7d0b%2F7a899e510fb30f24f570e996c895d143ac4b03b8.jpg&thumburl=http%3A%2F%2Fimg4.imgtn.bdimg.com%2Fit%2Fu%3D2019970444%2C20888940%26fm%3D21%26gp%3D0.jpg";
17     //創建線程
18     NSThread *downloadImage = [[NSThread alloc] initWithTarget:self selector:@selector(downLoadImage:) object:url];
19     //啟動線程
20     [downloadImage start];
21    
22     
23 }
24 -(void)downLoadImage:(NSString *)url
25 {
26     NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
27     UIImage *image = [UIImage imageWithData:data];
28     //返回主線程刷新UI
29     
30     [self performSelectorOnMainThread:@selector(reloadUI:) withObject:image waitUntilDone:NO];
31 }
32 -(void)reloadUI:(UIImage *)image
33 {
34     _imageV.image = image;
35 }
36 @end

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • HTTP請求工具類(功能:1、獲取網頁html;2、下載網路圖片;): using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System
  • 今年做的一個上位機工控WPF項目,做個小小的總結把,以後隨時來找 請不要帶血亂噴,我只是菜鳥.___by 鮑隊 類似於這樣子的;大致的意思是:一個代碼變數,通過改變變數的值,綁定這個變數的這個圓顏色也在變化 就是一種心跳效果 在網上數據觸發的感覺不多,廢了不少時間,這裡做個總結 1:通知 class
  • 許可權系統的組成通常包括RBAC模型、許可權驗證、許可權管理以及界面訪問控制。現有的一些許可權系統分析通常存在以下問題: (1)沒有許可權的設計思路 認為所有系統都可以使用一套基於Table設計的許可權系統。事實上設計許可權系統的重點是判斷角色的穩定性和找出最小授權需求。角色的穩定性決定了系統是通過角色判斷許可權還
  • 公司準備開發一套工作流引擎,以前沒有什麼OA開發經驗,也是第一次設計工作流引擎,我把我的一些思路分享一下,希望得到些幫助或者能幫助到一些人。 產品的定位: 1、能夠做到前後端分離 2、可以做到項目的分離使用,通過介面來實現 3、支持複雜流程邏輯 例如: 填寫加班表單-》多人審核=》退回=》填寫證明人
  • 作業: 使用正則表達式和遞歸實現計算器功能。 實現: 1、實現帶括弧的計算 2、實現指數、加減乘除求餘等功能 一、實例說明: 本實例自己寫了個版本,但依舊存在一點bug,例:-2-2等計算問題,故最後在武SIR的代碼基礎上加了指數、求餘等功能。 該計算器思路: 1、遞歸尋找表達式中只含有 數字和運算
  • Python是跨平臺的語言,也即是說同樣的源代碼在不同的操作系統不需要修改就可以同樣實現 因此Python的作者就倒騰了OS模塊這麼一個玩意兒出來,有了OS模塊,我們不需要關心什麼操作系統下使用什麼模塊,OS模塊會幫你選擇正確的模塊並調用 os模塊中關於文件/目錄常用的函數使用方法os.path模塊
  • 轉載:http://blog.csdn.net/afgasdg/article/details/12757433
  • 1.主要學習這程式的編寫思路 a.讀取解釋網站 b.找到相關頁 c.找到圖片鏈接的元素 d.保存圖片到文件夾 ..... 將每一個步驟都分解出來,然後用函數去實現,代碼易讀性高. ##代碼儘快運行時會報錯,還須修改 import urllib.request import os def url_op
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...