您現在的位置是:電腦技術吧?>? 編程技術 ??>??c 多線程編程,多線程編程java??>??正文詳情

c 多線程編程,多線程編程java

庾建義2019-12-23 11:02:44 人圍觀
簡介java多線程編程實戰一。簡介:1.1ios有三種多線程編程技術:1。螺紋2。可可nsoperation 3。GCD全名:grjava多線程編程題

1、簡介:  1.1 iOS有三種多線程編程的技術,分別是:  1.、NSThread  2、Cocoa NSOperation (iOS多線程編程之NSOperation和NSOperationQueue的使用)  3、GCD 全稱:Grand Central Dispatch( iOS多線程編程之Grand Central Dispatch(GCD)介紹和使用)  這三種編程方式從上到下,抽象度層次是從低到高的,抽象度越高的使用越簡單,也是Apple最推薦使用的。

  這篇我們主要介紹和使用NSThread,后面會繼續2、3 的講解和使用。

  1.2 三種方式的優缺點介紹:  NSThread:  優點:NSThread 比其他兩個輕量級  缺點:需要自己管理線程的生命周期,線程同步。

線程同步對數據的加鎖會有一定的系統開銷  NSThread實現的技術有下面三種:

  一般使用cocoa thread 技術。

  Cocoa operation  優點:不需要關心線程管理,數據同步的事情,可以把精力放在自己需要執行的操作上。

  Cocoa operation 相 關的類是 NSOperation ,NSOperationQueue。

NSOperation是個抽象類,使用它必須用它的子類,可以實現它或者使用 它定義好的兩個子類:NSInvocationOperation 和 NSBlockOperation。

創建NSOperation子類的對象,把對 象添加到NSOperationQueue隊列里執行。

  GCD  Grand Central Dispatch (GCD) 是Apple開發的一個多核編程的解決方法。

在iOS4.0開始之后才能使用。

GCD是一個替代諸如 NSThread, NSOperationQueue, NSInvocationOperation等技術的很高效和強大的技術。

現在的iOS系統都 升級到6了,所以不用擔心該技術不能使用。

  介紹完這三種多線程編程方式,我們這篇先介紹NSThread的使用。

  2、NSThread的使用  2.1 NSThread 有兩種直接創建方式:  - (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument   (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument  第一個是實例方法,第二個是類方法  [NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];  NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];  [myThread start];  2.2參數的意義:  selector :線程執行的方法,這個selector只能有一個參數,而且不能有返回值。

  target :selector消息發送的對象  argument:傳輸給target的唯一參數,也可以是nil  第一種方式會直接創建線程并且開始運行線程,第二種方式是先創建線程對象,然后再運行線程操作,在運行線程操作前可以設置線程的優先級等線程信息  2.3 PS:不顯式創建線程的方法:  用NSObject的類方法 performSelectorInBackground:withObject: 創建一個線程:  [Obj performSelectorInBackground:@selector(doSomething) withObject:nil];  2.4 下載圖片的例子:  2.4.1 新建singeView app  新建項目,并在xib文件上放置一個imageView控件。

按住control鍵拖到viewController.h文件中創建imageView IBOutlet ViewController.m中實現:  // ViewController.m  // NSThreadDemo  //  // Created by rongfzh on 12-9-23.  // Copyright (c) 2012年 rongfzh. All rights reserved.  //  #import ViewController.h  #define kURL @http://avatar.csdn.net/2/C/D/1_totogo2010.jpg  @interface ViewController ()  @end  @implementation ViewController  d)downloadImage:(NSString *) url{  NSData *data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:url]];  UIImage *image = [[UIImage alloc]initWithData:data];  if(image == nil){  }else{  [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];  }  }  d)updateUI:(UIImage*) image{  self.imageView.image = image;  }  - (void)viewDidLoad  {  [super viewDidLoad];  // [NSThread detachNewThreadSelector:@selector(downloadImage:) toTarget:self withObject:kURL];  NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(downloadImage:) object:kURL];  [thread start];  }  - (void)didReceiveMemoryWarning  {  [super didReceiveMemoryWarning];  // Dispose of any resources that can be recreated.  }  @end  2.4.2線程間通訊  線程下載完圖片后怎么通知主線程更新界面呢?  [selfperformSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];  performSelectorOnMainThread是NSObject的方法,除了可以更新主線程的數據外,還可以更新其他線程的比如:  用:performSelector:onThread:withObject:waitUntilDone:  運行下載圖片:

  圖片下載下來了。

  2.3 線程同步  我們演示一個經典的賣票的例子來講NSThread的線程同步:  .h  #import  @class ViewController;  @interface AppDelegate : UIResponder  {  int tickets;  int count;  NSThread* ticketsThreadone;  NSThread* ticketsThreadtwo;  NSCondition* ticketsCondition;  NSLock *theLock;  }  @property (strong, nonatomic) UIWindow *window;  @property (strong, nonatomic) ViewController *viewController;  @end  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  {  tickets = 100;  count = 0;  theLock = [[NSLock alloc] init];  // 鎖對象  ticketsCondition = [[NSCondition alloc] init];  ticketsThreadone = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];  [ticketsThreadone setName:@Thread-1];  [ticketsThreadone start];  ticketsThreadtwo = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];  [ticketsThreadtwo setName:@Thread-2];  [ticketsThreadtwo start];  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];  // Override point for customization after application launch.  self.viewController = [[ViewController alloc] initWithNibName:@ViewController bundle:nil];  self.window.rootViewController = self.viewController;  [self.window makeKeyAndVisible];  return YES;  }  - (void)run{  while (TRUE) {  // 上鎖  // [ticketsCondition lock];  [theLock lock];  if(tickets = 0){  [NSThread sleepForTimeInterval:0.09];  count = 100 - tickets;  NSLog(@當前票數是:%d,售出:%d,線程名:%@,tickets,count,[[NSThread currentThread] name]);  tickets--;  }else{  break;  }  [theLock unlock];  // [ticketsCondition unlock];  }  }  如果沒有線程同步的lock,賣票數可能是-1.加上lock之后線程同步保證了數據的正確性。

  上面例子我使用了兩種鎖,一種NSCondition ,一種是:NSLock。

NSCondition我已經注釋了。

  線程的順序執行  他們都可以通過  [ticketsConditionsignal]; 發送信號的方式,在一個線程喚醒另外一個線程的等待。

  比如:  #import AppDelegate.h  #import ViewController.h  @implementation AppDelegate  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  {  tickets = 100;  count = 0;  theLock = [[NSLock alloc] init];  // 鎖對象  ticketsCondition = [[NSCondition alloc] init];  ticketsThreadone = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];  [ticketsThreadone setName:@Thread-1];  [ticketsThreadone start];  ticketsThreadtwo = [[NSThread alloc] initWithTarget:self selector:@selector(run) object:nil];  [ticketsThreadtwo setName:@Thread-2];  [ticketsThreadtwo start];  NSThread *ticketsThreadthree = [[NSThread alloc] initWithTarget:self selector:@selector(run3) object:nil];  [ticketsThreadthree setName:@Thread-3];  [ticketsThreadthree start];  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];  // Override point for customization after application launch.  self.viewController = [[ViewController alloc] initWithNibName:@ViewController bundle:nil];  self.window.rootViewController = self.viewController;  [self.window makeKeyAndVisible];  return YES;  }  -(void)run3{  while (YES) {  [ticketsCondition lock];  [NSThread sleepForTimeInterval:3];  [ticketsCondition signal];  [ticketsCondition unlock];  }  }  - (void)run{  while (TRUE) {  // 上鎖  [ticketsCondition lock];  [ticketsCondition wait];  [theLock lock];  if(tickets = 0){  [NSThread sleepForTimeInterval:0.09];  count = 100 - tickets;  NSLog(@當前票數是:%d,售出:%d,線程名:%@,tickets,count,[[NSThread currentThread] name]);  tickets--;  }else{  break;  }  [theLock unlock];  [ticketsCondition unlock];  }  }  wait是等待,我加了一個 線程3 去喚醒其他兩個線程鎖中的wait  其他同步  我們可以使用指令@synchronized來簡化 NSLock的使用,這樣我們就不必顯示編寫創建NSLock,加鎖并解鎖相關代碼。

  - (void)doSomeThing:(id)anObj  {  @synchronized(anObj)  {  // Everything between the braces is protected by [email protected]  }  }  還有其他的一些鎖對象,比如:循環鎖NSRecursiveLock,條件鎖NSConditionLock,分布式鎖NSDistributedLock等等,可以自己看官方文檔學習

版權聲明:本文由 庾建義 整理編輯。

原標題:python多線程編程,socket多線程編程

轉載注明出處:http://www.dn9ww09s.icu/program/15636.html

文章評論

    共有條評論來說兩句吧...

    用戶名:

    驗證碼:

作者推薦

  • 快速關鍵代碼,關鍵代碼段

    快速關鍵代碼,關鍵代碼段 相關圖片直接關機的代碼一。用于確定郵箱格式是否正確的代碼://verify-(bool)isvalidateemail:(nsstring*)email{nsstring*emailcnas關鍵代碼...

  • 什么是線程,java線程同步機制

    什么是線程,java線程同步機制 相關圖片進程和線程的區別本文主要介紹JavaScript線程和計時機制的相關信息。對于您的朋友,請參考setTimeout和setinterval的JavaScript API文檔,定java線程狀態...

  • 子網掩碼和網關,子網掩碼 網關

    子網掩碼和網關,子網掩碼 網關 相關圖片ip地址子網掩碼網關怎么填本文采用JS對IP、子網掩碼、網關和MAC進行驗證。與您分享以供參考。具體如下:?123456789101314151617181920212223252627ip地址,子網掩碼,默認網關...

  • ios框架,iOS相關框架

    ios框架,iOS相關框架 相關圖片ios網絡框架在Mac和iOS上,可可是一種快速、簡單、功能強大且靈活的日志記錄框架。Cocoa lumberjack與流行的日志框架(如log4j)類似,但它是為Objecios直播框架...

  • 應用程序是什么,安裝應用程序

    應用程序是什么,安裝應用程序 相關圖片手機應用程序在哪里Watchkit應用程序體系結構Watchkit應用程序是運行在Apple watch中的可執行文件。它包括腳本和渲染屏幕所需的資源文件。watchkit擴展是桌面應用程序...

  • linux shell exec,linux的shell命令

    linux shell exec,linux的shell命令 相關圖片python調用shell經常會遇到操作部門需要清除緩存的情況,但緩存始終存在問題。這不是在電腦前處理的方法。我想到了一種通過訪問JSP page%@page language=Javalinux常用命令...

  • 數據庫應用,數據庫使用

    數據庫應用,數據庫使用 相關圖片數據庫什么用1、 在ASP中,用于訪問數據庫的對象稱為ADO(active data objects)。對象有三種:連接、記錄集和命令連接。他們負責打開或連接數據拿數據庫...

  • redis緩存php,redis緩存機制php

    redis緩存php,redis緩存機制php 相關圖片redis緩存常用數據除了Memcache(一個常見的PHP操作類庫)之外,我們還可能非常熟悉內存緩存,即redis。我們與您分享的PHP技術文章是關于如何使用PHP操作redis,怎么使用redis緩存...

  • 兩種方案對比分析方法,對比分析的文章

    兩種方案對比分析方法,對比分析的文章 相關圖片空調方案對比分析這是對Ajax中兩種JSON解析方法的比較分析,非常實用。本文是一篇學習筆記,一篇新手文章,歡迎指教!Eval();//此方法不建議使用JSON。Parse()施工方案對比分析...

  • 字符串怎么轉json,字符串轉json數組

    字符串怎么轉json,字符串轉json數組 相關圖片將json轉換為字符串本文主要介紹了JavaScript中字符串到JSON的兩種方法,一種是使用JS函數eval(),另一種是使用jQuery。Parsejson()。對于朋友,請參字符串和json的轉換...

熱評文章

  • 窗口程序用什么語言,應用程序怎么打開

    窗口程序用什么語言,應用程序怎么打開 相關圖片安卓應用開發語言在應用程序中使用多語言通常有兩種方式:一是為用戶提供選擇自己語言的機會;二是根據當前用戶當前的移動設備語言自動將我們的應用程序切換到相應的語言。第...

  • memcache緩存,memcache本地緩存

    memcache緩存,memcache本地緩存 相關圖片memcache分布式緩存一般來說,如果并發量很小,則對不使用緩存技術沒有影響。但是,如果并發量很大,使用緩存技術就顯得非常重要,這可以降低數據庫和服務器的壓力。當然,有很多...

  • mathjax基本語法,c 基本語法

    mathjax基本語法,c  基本語法 相關圖片C語言的基本語法1、 JSP元素1,腳本元素,包括表達式,代碼片段(包括內置類),聲明(成員變量和方法),注釋(輸出和隱藏)2,指令元素,包括頁(語言,擴展,導入,會話,緩沖...

  • asp_html,asp就是html嗎

    asp_html,asp就是html嗎 相關圖片html打開asp頁面巧用ASP語言過濾HTML元素:“過濾HTML”函數名:glhtml“函數:過濾HTML元素”參數:STR----過濾字符“返回值:無HTML字符”******asp和php...

  • 探索發現筆記,探索筆記怎么開啟

    探索發現筆記,探索筆記怎么開啟 相關圖片紫水宮探索筆記什么是UI測試?UI測試是一個自動測試UI和交互的測試組件。UI測試有什么用?它可以通過編寫代碼或記錄開發人員的操作過程和編碼,自動點擊按鈕、查看或輸入文本。用...

  • url帶參數,url傳參數

    url帶參數,url傳參數 相關圖片url參數錯誤本文的例子描述了用JavaScript獲取URL查詢參數的方法。與您分享以供參考。具體實現方法如下:?12345678910函數getqueryvariableurl是啥...

  • weblogic并發連接數,iis最大并發連接數

    weblogic并發連接數,iis最大并發連接數 相關圖片udp并發連接數無法連接到Oracle數據庫。相關錯誤oerr:ora-12519 TNS:未找到適當的服務處理程序。客戶端連接間歇性失敗。Ora-12519原因:LIStomcat并發連接數...

  • 表格中怎么使用函數,函數在表格中怎么使用

    表格中怎么使用函數,函數在表格中怎么使用 相關圖片表格中如何用函數在使用SQL的過程中,我們偶爾會遇到需要更改數據存儲形式的情況。例如,數據庫的表(info)中有一個字段education,用于存儲JSON數組。現在,由于需求表格中函數的應...

  • 數據庫運算符,數據庫比較運算符

    數據庫運算符,數據庫比較運算符 相關圖片數據類型運算符與表達式如果您最近執行了select或update查詢,則可能會使用一個或多個MySQL比較運算符來限制查詢的輸出。比較是大多數select查詢不可分割的一部分,MyS數據庫四大運算符...

  • Android內存泄露,Android內存泄漏

    Android內存泄露,Android內存泄漏 相關圖片安卓內存溢出的原因本文主要介紹Android加載圖片時內存溢出問題的解決方案。本文介紹如何使用bitmapfactory.options解決內存溢出問題。請參考以下1。在AndrAndroid系統內存出錯怎么辦...

關注微信

变脸官网查询