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

来源: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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...