多執行緒:barrier的使用
//
// ViewController.m
// 12-barrier使用
//
// Created by gzxzmac on 16/1/29.
// Copyright © 2016年 gzxzmac. All rights reserved.
//
#import "ViewController.h"
@interface ViewController () {
dispatch_queue_t _queue;
}
@property (nonatomic, strong) NSMutableArray *photoList; // 儲存下載好的圖片
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self download];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
NSLog(@"下載了 %zd 張圖片",self.photoList.count);
}
// 最快速建立一個可變的陣列 @[].mutableCopy
- (NSMutableArray *)photoList {
if (_photoList == nil) {
_photoList = [NSMutableArray array];
}
return _photoList;
}
- (void)download {
// NSArray,字典,NSData,..... 執行緒安全
// 所有的可變的物件(字典,陣列,data) 非執行緒安全
/*
NSArchiver
NSAutoreleasePool
NSBundle
NSCalendar
NSCoder
NSCountedSet
NSDateFormatter
NSEnumerator
NSFileHandle
NSFormatter
NSHashTable functions
NSInvocation
NSJavaSetup functions
NSMapTable functions
NSMutableArray
NSMutableAttributedString
NSMutableCharacterSet
NSMutableData
NSMutableDictionary
NSMutableSet
NSMutableString
NSNotificationQueue
NSNumberFormatter
NSPipe
NSPort
NSProcessInfo
NSRunLoop
NSScanner
NSSerializer
NSTask
NSUnarchiver
NSUndoManager
*/
// 一定要使用自定義的併發佇列
_queue = dispatch_queue_create("itcast", DISPATCH_QUEUE_CONCURRENT);
for (int i = 0; i < 1000; ++i) {
dispatch_async(_queue, ^{
NSLog(@"下載圖片%d",i);
[NSThread sleepForTimeInterval:0.5];
// 模擬下載
NSString *imageName = [NSString stringWithFormat:@"%d.jpg",i % 9];
NSString *path = [[NSBundle mainBundle]pathForResource:imageName ofType:nil];
UIImage *image = [UIImage imageWithContentsOfFile:path];
// 使用barrier 之後,全部下載完之後,再統一儲存
// 減少多條執行緒搶奪資源的問題
// 在工作中基本不怎麼使用(知道)
dispatch_barrier_async(_queue, ^{
if (image == nil) {
NSLog(@"%d -- %@",i,path);
}
NSLog(@"儲存圖片%@",[NSThread currentThread]);
// 避免多個執行緒搶同一塊資源
[self.photoList addObject:image];
});
});
}
}
@end
相關文章
- Java多執行緒-執行緒池的使用Java執行緒
- java多執行緒之執行緒的基本使用Java執行緒
- 使用委託開啟多執行緒(多執行緒深入)執行緒
- 多執行緒的libcurl的使用執行緒
- java使用多執行緒Java執行緒
- iOS多執行緒全套:執行緒生命週期,多執行緒的四種解決方案,執行緒安全問題,GCD的使用,NSOperation的使用iOS執行緒GC
- Java多執行緒的使用(二)Java執行緒
- 多執行緒和多執行緒同步執行緒
- 多執行緒程式設計基礎(一)-- 執行緒的使用執行緒程式設計
- 多執行緒:執行緒池理解和使用總結執行緒
- 執行緒以及多執行緒,多程式的選擇執行緒
- 執行緒與多執行緒執行緒
- 多執行緒【執行緒池】執行緒
- 多執行緒--執行緒管理執行緒
- @Async使用ThreadPoolTaskExecutor 多執行緒thread執行緒
- Swift多執行緒:使用Thread進行多執行緒間通訊,協調子執行緒任務Swift執行緒thread
- Java多執行緒——synchronized的使用示例Java執行緒synchronized
- 多執行緒程式設計基礎(二)-- 執行緒池的使用執行緒程式設計
- 執行緒和程式基礎以及多執行緒的基本使用(iOS)執行緒iOS
- java 多執行緒之使用 interrupt 停止執行緒的幾種方法Java執行緒
- 多執行緒(五)---執行緒的Yield方法執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- springboot配置執行緒池使用多執行緒插入資料Spring Boot執行緒
- Java多執行緒-執行緒中止Java執行緒
- 多執行緒之初識執行緒執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- 多執行緒系列(1),多執行緒基礎執行緒
- .net使用Task多執行緒執行任務 .net限制執行緒數量執行緒
- Java多執行緒Thread類使用Java執行緒thread
- C++使用Boost多執行緒C++執行緒
- 【Java】【多執行緒】執行緒的生命週期Java執行緒
- a、多執行緒執行緒
- Linux多執行緒的使用一:互斥鎖Linux執行緒
- 多執行緒的概述執行緒
- 多執行緒之手撕執行緒池執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- kuangshenshuo-多執行緒-執行緒池執行緒
- java多執行緒9:執行緒池Java執行緒