關於創建及使用多線程的幾種方法

来源:http://www.cnblogs.com/shouce/archive/2016/02/23/5208723.html
-Advertisement-
Play Games

近期剛剛學習了一種多線程技術,現結合自己的理解將其羅列出來,希望能夠與大家交流一下,多線程是一種能夠節省程式運算時間的方法,大大的提高了程式的運算效率,那麼首先我們來說一下進程和線程概念: 一個程式包含一個以上的進程,而一個進程又可以包含一個以上的線程,每一個進程都有自己獨立的記憶體空間,相應的一個進


近期剛剛學習了一種多線程技術,現結合自己的理解將其羅列出來,希望能夠與大家交流一下,多線程是一種能夠節省程式運算時間的方法,大大的提高了程式的運算效率,那麼首先我們來說一下進程和線程概念:

  一個程式包含一個以上的進程,而一個進程又可以包含一個以上的線程,每一個進程都有自己獨立的記憶體空間,相應的一個進程中的所有線程都共用該記憶體空間。

  進程:是一個具有一定獨立功能的程式關於某個數據集合的一次運行活動。它是操作系統動態執行的基本單元,在傳統的操作系統中,進程既是基本的資源分配單元,也是基本的執行單元。獨立的地址空間使得不同的進程共用狀態信息變得非常困難,為了共用信息,它們必須顯式的使用(進程通信機制),進程之間通信比較慢,因為進程式控制制和進程式通信機制開銷很大。

  線程:進程作為分配資源的基本單位,而把線程作為獨立運行和獨立調度的基本單位,由於線程比進程更小,基本上不擁有系統資源,故對它的調度所付出的開銷就會小得多,能更高效的提高系統內多個程式間併發執行的程度。一個線程就是運行在進程上下文的一個邏輯流。現代操作系統允許我們編寫一個進程里同時運行多個線程的程式。線程由內核調度。每個進程開始生命周期時都是單一線程,這個線程稱為主線程,在某一時刻,主線程創建一個對等線程。從這個時間點開始,兩個線程就併發運行。最後,因為主線程執行一個慢速系統調用,如read或者sleep,控制就會通過上下文切換傳遞到對等線程。在控制傳遞迴主線程前,對等線程會執行一段時間。

 

  (一) 傳統的程式執行方式是一種順序執行方式,即本句執行完成之後,才會執行下一句。

     在調用一個函數或者執行一個數位塊時,執行該程式占用系統主程式的執行時間,也就是說,這個函數或代碼塊不執行完系統是不會執行下一條指令的:

     例如: 我們在主函數里調用 [self doOneThing];[self doTheSecondThing]; 只有第一個正確執行後才會執行下一個函數。

 

  (二) 多線程下程式塊可以併發執行,大大地節省了程式的執行時間,下麵列出創建多線程的幾種方式:

      (1)使用performSelectorInBackground創建一個線程:也就是說在程式執行doThing與執行下一段程式是同步執行的

        [self performSelectorInBackground:@selector(doThing) withObject:nil];

    

      (2)直接創建一個線程,selector選擇器則指明將要進行的操作,用這種方法時線程直接啟動:

        [NSThread detachNewThreadSelector:@selector(doThing) toTarget:self withObject:nil];

      

      (3)創建一個線程並設置啟動方式

        NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(doThing) object:nil];

           thread.name = @"QingYun";

              [thread start];

 

      (4)創建一個多線程的隊列

        NSOperationQueue *queue = [[NSOperationQueue alloc] init];

          創建一個操作對象,這個操作對象定義了多線程需要執行作務

          NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doThing) object:nil];

         [queue addOperation:operation];       //    將操作對象放到這個隊列里,這樣線程就可以直接啟動

 

       (5)使用Block塊操作對象的方式創建線程,添加到隊列中並啟動線程

        NSOperationQueue *queue = [[NSOperationQueue alloc] init];

            NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{

             NSLog(@"do thing....");

         [NSThread sleepForTimeInterval:10];}

        [queue addOperation:operation];

 

       (6)使用隊列分發模式創建線程:下麵以非同步分發創建線程為例說明其工作原理,在非同步線程中,在分發時系統對線程按順序分發下去,但在執行的過程中,則線程之間又存在相互競爭的關係。

        dispatch_queue_t queque = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

         dispatch_async (queque,^{  [NSThreadsleepForTimeInterval:5];};

        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{[NSThreadsleepForTimeInterval:5];};

    


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

-Advertisement-
Play Games
更多相關文章
  • 對jQuery來說,超時可以直接設置timeout參數,併在error事件中捕獲第二個參數,如果是“timeout”則表明捕獲了超時事件,非常清楚。 例子: $.ajax({ type: "POST", contentType: "application/json", url: "../ws/MyS
  • 1.通過在事件名稱後面添加以點號分隔的尾碼來為事件名稱指派命名空間 $("#button").bind("click.editMode",function(){}); $("#buttonM").bind("click.editMode",function(){}); 2.再通過unbind解除該組
  • 剛開始學習前端的時候開始整理這個文檔,現在內容已經逐漸增多。雖然現在看起來,文檔里的內容非常簡單,但是看著這些內容,好像還依稀記得這一行行代碼當時被記錄的情景。所以我想把這段回憶保存起來,為剛接觸前端的童鞋們提供一個簡單的查詢的途徑,也以此來緬懷我的前端學習之路。 此文檔,我會持續更新 jquery
  • code display :: <!DOCTYPE HTML><html> <head> <link href="bootstrap.css" rel="stylesheet"> </head> <body> <div class="table-responsive"> <table class="
  • <script type="text/javascript"> (function($){ window.addEventListener("click",function(evt){ for(var i in evt) { console.log(i + "---" + evt[i]); } },
  • 前段時間看了大神的博客文章【使用Flexible實現手淘H5頁面的終端適配】(地址:http://www.w3cplus.com/mobile/lib-flexible-for-html5-layout.html),受益良多,寫了個小demo,記錄一下以防忘記,需要註意幾點,如下: 1. meta
  • 效果圖: 閃屏頁用到了handler和CountDownTimer類,還需配置一下Activity的主題,這裡是:android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 全屏主題的意思。 實現源碼: package com.example
  • 當一個iOS應用被送到後臺,它的主線程會被暫停。你用NSThread的detachNewThreadSelector:toTar get:withObject:類方法創建的線程也被掛起了。如果你想在後臺完成一個長期任務,就必須調用UIApplication的beginBackgroundTaskWi
一周排行
    -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# ...