多线程相关《队列与任务》简单了解1

1.关于多线程的基础简介:

多线程基础简介.png

注意点:从手动管理到自动管理,使用更多偏向于后两者,充分利用设备的多核。

2.队列和任务:

串行对列:按照顺序从左到右,从上到下依次执行。—— 先进先出

并行对列:看似同时一起执行,实际执行有时间先后,但执行时间有交叉。—— 时间上有交叉

什么时候会开启一条线程?

  1. 异步一定会开辟新线程嘛?不一定,同步串行一条对列。
  2. 同步一定不会开启新线程?不会

1.同步串行

/// 同步串行
- (void)syncSerial {
    NSLog(@"_开始_");
    dispatch_queue_t queue = dispatch_queue_create("yd.com.gcd", DISPATCH_QUEUE_SERIAL);
    dispatch_sync(queue, ^{
        NSLog(@"_任务1_");
    });
    dispatch_sync(queue, ^{
        NSLog(@"_任务2_");
    });
    dispatch_sync(queue, ^{
        NSLog(@"_任务3_");
    });
    NSLog(@"_结束_");
/*
执行结果:
2022-08-19 22:16:55.437781+0800 YDBasicPublicCourse[30677:1915128] _开始_
2022-08-19 22:16:55.438867+0800 YDBasicPublicCourse[30677:1915128] _任务1_
2022-08-19 22:16:55.440569+0800 YDBasicPublicCourse[30677:1915128] _任务2_
2022-08-19 22:16:55.441949+0800 YDBasicPublicCourse[30677:1915128] _任务3_
2022-08-19 22:16:55.442340+0800 YDBasicPublicCourse[30677:1915128] _结束_
*/
}

2.异步串行

/// 异步串行——串行队列中多个异步,只会开辟一条新线程
- (void)asyncSerial {
    NSLog(@"_开始_");
    dispatch_queue_t queue = dispatch_queue_create("yd.com.gcd", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        NSLog(@"_任务1_%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"_任务2_%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"_任务3_%@",[NSThread currentThread]);
    });
    NSLog(@"_结束_");
}
/*
执行结果1:
2022-08-19 22:34:51.896769+0800 YDBasicPublicCourse[30872:1929491] _开始_
2022-08-19 22:34:51.897045+0800 YDBasicPublicCourse[30872:1929491] _结束_
2022-08-19 22:34:51.897146+0800 YDBasicPublicCourse[30872:1929575] _任务1_<NSThread: 0x600001528780>{number = 4, name = (null)}
2022-08-19 22:34:51.897678+0800 YDBasicPublicCourse[30872:1929575] _任务2_<NSThread: 0x600001528780>{number = 4, name = (null)}
2022-08-19 22:34:51.897902+0800 YDBasicPublicCourse[30872:1929575] _任务3_<NSThread: 0x600001528780>{number = 4, name = (null)}


执行结果2:  可能会存在的一种情况。
2022-08-19 22:36:26.174839+0800 YDBasicPublicCourse[30901:1931698] _开始_
2022-08-19 22:36:26.175382+0800 YDBasicPublicCourse[30901:1931850] _任务1_<NSThread: 0x600003168740>{number = 5, name = (null)}
2022-08-19 22:36:26.175599+0800 YDBasicPublicCourse[30901:1931850] _任务2_<NSThread: 0x600003168740>{number = 5, name = (null)}
2022-08-19 22:36:26.175773+0800 YDBasicPublicCourse[30901:1931850] _任务3_<NSThread: 0x600003168740>{number = 5, name = (null)}
2022-08-19 22:36:26.175283+0800 YDBasicPublicCourse[30901:1931698] _结束_
*/
/// 异步并发——线程复用、高效率执行、充分利用内核——开辟线程数量有限
/// 并发对列中的异步不一定会开辟线程  内核数量3-6条
- (void)asyncConcurrent {
    NSLog(@"_开始_");
    dispatch_queue_t queue = dispatch_queue_create("yd.com.gcd", DISPATCH_QUEUE_CONCURRENT);
    dispatch_async(queue, ^{
        NSLog(@"_任务1_%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"_任务2_%@",[NSThread currentThread]);
    });
    dispatch_async(queue, ^{
        NSLog(@"_任务3_%@",[NSThread currentThread]);
    });
    NSLog(@"_结束_");
}
/*
执行结果:
2022-08-19 22:44:54.121690+0800 YDBasicPublicCourse[31035:1939697] _开始_
2022-08-19 22:44:54.121923+0800 YDBasicPublicCourse[31035:1939697] _结束_
2022-08-19 22:44:54.122020+0800 YDBasicPublicCourse[31035:1939767] _任务1_<NSThread: 0x600003733ec0>{number = 5, name = (null)}
2022-08-19 22:44:54.122021+0800 YDBasicPublicCourse[31035:1939762] _任务2_<NSThread: 0x600003761780>{number = 6, name = (null)}
2022-08-19 22:44:54.122091+0800 YDBasicPublicCourse[31035:1939763] _任务3_<NSThread: 0x600003761b00>{number = 4, name = (null)}
*/
/// 同步并发——阻塞当前线程(主线程)、不会开辟新线程。
- (void)syncConcurrent {
    NSLog(@"_开始_");
    dispatch_queue_t queue = dispatch_queue_create("yd.com.gcd", DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(queue, ^{
        NSLog(@"_任务1_%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"_任务1_%@",[NSThread currentThread]);
    });
    dispatch_sync(queue, ^{
        NSLog(@"_任务1_%@",[NSThread currentThread]);
    });
    NSLog(@"_结束_");
}
/*
执行结果:
2022-08-19 22:49:43.615796+0800 YDBasicPublicCourse[31099:1944106] _开始_
2022-08-19 22:49:43.616077+0800 YDBasicPublicCourse[31099:1944106] _任务1_<_NSMainThread: 0x600002040440>{number = 1, name = main}
2022-08-19 22:49:43.616256+0800 YDBasicPublicCourse[31099:1944106] _任务1_<_NSMainThread: 0x600002040440>{number = 1, name = main}
2022-08-19 22:49:43.616450+0800 YDBasicPublicCourse[31099:1944106] _任务1_<_NSMainThread: 0x600002040440>{number = 1, name = main}
2022-08-19 22:49:43.616598+0800 YDBasicPublicCourse[31099:1944106] _结束_
*/
/// 同步并发嵌套——不睡觉
- (void)syncConcurrentNesting {
    NSLog(@"_开始_");
    dispatch_queue_t queue = dispatch_queue_create("yd.com.gcd", DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(queue, ^{
        NSLog(@"_任务1_%@",[NSThread currentThread]);
        dispatch_async(queue, ^{
            NSLog(@"_任务2_%@",[NSThread currentThread]);
        });
        NSLog(@"_任务3_%@",[NSThread currentThread]);
    });
    NSLog(@"_结束_");
}
/*
2022-08-19 23:11:01.372239+0800 YDBasicPublicCourse[31301:1958263] _开始_
2022-08-19 23:11:01.372534+0800 YDBasicPublicCourse[31301:1958263] _任务1_<_NSMainThread: 0x600002eb4000>{number = 1, name = main}
2022-08-19 23:11:01.372760+0800 YDBasicPublicCourse[31301:1958263] _任务3_<_NSMainThread: 0x600002eb4000>{number = 1, name = main}
2022-08-19 23:11:01.372784+0800 YDBasicPublicCourse[31301:1958342] _任务2_<NSThread: 0x600002efd740>{number = 4, name = (null)}
2022-08-19 23:11:01.372912+0800 YDBasicPublicCourse[31301:1958263] _结束_
*/
/// 同步并发嵌套——睡二觉
- (void)syncConcurrentNesting {
    NSLog(@"_开始_");
    dispatch_queue_t queue = dispatch_queue_create("yd.com.gcd", DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(queue, ^{
        NSLog(@"_任务1_%@",[NSThread currentThread]);
        dispatch_async(queue, ^{
            NSLog(@"_任务2_%@",[NSThread currentThread]);
        });
        sleep(2);
        NSLog(@"_任务3_%@",[NSThread currentThread]);
    });
    NSLog(@"_结束_");
}
/*
2022-08-19 23:20:08.872773+0800 YDBasicPublicCourse[31389:1964271] _开始_
2022-08-19 23:20:08.873963+0800 YDBasicPublicCourse[31389:1964271] _任务1_<_NSMainThread: 0x6000030c4140>{number = 1, name = main}
2022-08-19 23:20:08.874272+0800 YDBasicPublicCourse[31389:1964374] _任务2_<NSThread: 0x60000308a700>{number = 7, name = (null)}
2022-08-19 23:20:10.874488+0800 YDBasicPublicCourse[31389:1964271] _任务3_<_NSMainThread: 0x6000030c4140>{number = 1, name = main}
2022-08-19 23:20:10.874714+0800 YDBasicPublicCourse[31389:1964271] _结束_
*/
/// 同步并发嵌套——睡一觉、取决于内部的耗时时长。
- (void)syncConcurrentNesting {
    NSLog(@"_开始_");
    dispatch_queue_t queue = dispatch_queue_create("yd.com.gcd", DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(queue, ^{
        NSLog(@"_任务1_%@",[NSThread currentThread]);
        dispatch_async(queue, ^{
            sleep(2);
            NSLog(@"_任务2_%@",[NSThread currentThread]);
        });
        NSLog(@"_任务3_%@",[NSThread currentThread]);
    });
    NSLog(@"_结束_");
}
/*
2022-08-19 23:27:38.195428+0800 YDBasicPublicCourse[31445:1968352] _开始_
2022-08-19 23:27:38.195734+0800 YDBasicPublicCourse[31445:1968352] _任务1_<_NSMainThread: 0x6000011ac900>{number = 1, name = main}
2022-08-19 23:27:38.195921+0800 YDBasicPublicCourse[31445:1968352] _任务3_<_NSMainThread: 0x6000011ac900>{number = 1, name = main}
2022-08-19 23:27:38.196106+0800 YDBasicPublicCourse[31445:1968352] _结束_
2022-08-19 23:27:40.196172+0800 YDBasicPublicCourse[31445:1968492] _任务2_<NSThread: 0x6000011e0fc0>{number = 7, name = (null)}
*/
/// 同步并发>并发嵌套
- (void)syncConcurrentNesting {
    NSLog(@"_开始_");
    dispatch_queue_t queue = dispatch_queue_create("yd.com.gcd", DISPATCH_QUEUE_CONCURRENT);
    dispatch_sync(queue, ^{
        NSLog(@"_任务1_%@",[NSThread currentThread]);
        dispatch_sync(queue, ^{
            NSLog(@"_任务2_%@",[NSThread currentThread]);
        });
        NSLog(@"_任务3_%@",[NSThread currentThread]);
    });
    NSLog(@"_结束_");
}
/*
2022-08-19 23:36:15.762194+0800 YDBasicPublicCourse[31519:1973664] _开始_
2022-08-19 23:36:15.763770+0800 YDBasicPublicCourse[31519:1973664] _任务1_<_NSMainThread: 0x600001930000>{number = 1, name = main}
2022-08-19 23:36:15.769405+0800 YDBasicPublicCourse[31519:1973664] _任务2_<_NSMainThread: 0x600001930000>{number = 1, name = main}
2022-08-19 23:36:15.773415+0800 YDBasicPublicCourse[31519:1973664] _任务3_<_NSMainThread: 0x600001930000>{number = 1, name = main}
2022-08-19 23:36:15.776105+0800 YDBasicPublicCourse[31519:1973664] _结束_
*/
/// 异步串行嵌套
- (void)syncSerialAsync {
    NSLog(@"_开始_");
    dispatch_queue_t queue = dispatch_queue_create("yd.com.gcd", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        NSLog(@"_任务1_%@",[NSThread currentThread]);
        dispatch_async(queue, ^{
            NSLog(@"_任务2_%@",[NSThread currentThread]);
        });
        NSLog(@"_任务3_%@",[NSThread currentThread]);
    });
    NSLog(@"_结束_");
}
/*
执行结果:
2022-08-19 23:42:36.232114+0800 YDBasicPublicCourse[31569:1977932] _开始_
2022-08-19 23:42:42.842165+0800 YDBasicPublicCourse[31569:1977932] _结束_
2022-08-19 23:42:42.842246+0800 YDBasicPublicCourse[31569:1978108] _任务1_<NSThread: 0x60000088d480>{number = 7, name = (null)}
2022-08-19 23:42:42.842628+0800 YDBasicPublicCourse[31569:1978108] _任务3_<NSThread: 0x60000088d480>{number = 7, name = (null)}
2022-08-19 23:42:42.842821+0800 YDBasicPublicCourse[31569:1978108] _任务2_<NSThread: 0x60000088d480>{number = 7, name = (null)}
*/
/// 异步串行嵌套——睡一觉
- (void)syncSerialAsync {
    NSLog(@"_开始_");
    dispatch_queue_t queue = dispatch_queue_create("yd.com.gcd", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        NSLog(@"_任务1_%@",[NSThread currentThread]);
        dispatch_async(queue, ^{
            sleep(2);
            NSLog(@"_任务2_%@",[NSThread currentThread]);
        });
        NSLog(@"_任务3_%@",[NSThread currentThread]);
    });
    NSLog(@"_结束_");
}
/*
执行结果:
2022-08-19 23:45:51.657954+0800 YDBasicPublicCourse[31604:1980828] _开始_
2022-08-19 23:45:51.658231+0800 YDBasicPublicCourse[31604:1980828] _结束_
2022-08-19 23:45:51.658391+0800 YDBasicPublicCourse[31604:1981007] _任务1_<NSThread: 0x6000038c5f40>{number = 6, name = (null)}
2022-08-19 23:45:51.658562+0800 YDBasicPublicCourse[31604:1981007] _任务3_<NSThread: 0x6000038c5f40>{number = 6, name = (null)}
2022-08-19 23:45:53.663426+0800 YDBasicPublicCourse[31604:1981007] _任务2_<NSThread: 0x6000038c5f40>{number = 6, name = (null)}

执行结果2:
2022-08-19 23:50:56.097268+0800 YDBasicPublicCourse[31653:1984727] _开始_
2022-08-19 23:50:56.097575+0800 YDBasicPublicCourse[31653:1984898] _任务1_<NSThread: 0x6000037de640>{number = 6, name = (null)}
2022-08-19 23:50:56.097976+0800 YDBasicPublicCourse[31653:1984898] _任务3_<NSThread: 0x6000037de640>{number = 6, name = (null)}
2022-08-19 23:50:56.097493+0800 YDBasicPublicCourse[31653:1984727] _结束_
2022-08-19 23:50:58.102417+0800 YDBasicPublicCourse[31653:1984898] _任务2_<NSThread: 0x6000037de640>{number = 6, name = (null)}
*/
/// 异步串行嵌套——睡一觉
- (void)syncSerialAsync {
    NSLog(@"_开始_");
    dispatch_queue_t queue = dispatch_queue_create("yd.com.gcd", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        NSLog(@"_任务1_%@",[NSThread currentThread]);
        dispatch_async(queue, ^{
            NSLog(@"_任务2_%@",[NSThread currentThread]);
        });
        sleep(2);
        NSLog(@"_任务3_%@",[NSThread currentThread]);
    });
    NSLog(@"_结束_");
}
/*
2022-08-19 23:56:10.330153+0800 YDBasicPublicCourse[31695:1988183] _开始_
2022-08-19 23:56:10.330474+0800 YDBasicPublicCourse[31695:1988304] _任务1_<NSThread: 0x6000028a8040>{number = 7, name = (null)}
2022-08-19 23:56:10.330473+0800 YDBasicPublicCourse[31695:1988183] _结束_
2022-08-19 23:56:12.334013+0800 YDBasicPublicCourse[31695:1988304] _任务3_<NSThread: 0x6000028a8040>{number = 7, name = (null)}
2022-08-19 23:56:12.334344+0800 YDBasicPublicCourse[31695:1988304] _任务2_<NSThread: 0x6000028a8040>{number = 7, name = (null)}
*/

主对列是串行队列、全局队列是并发队列

/// 多线程死锁——2个任务相互等待造成的、嵌套死锁
- (void)multithreads {
    NSLog(@"_开始_");
    dispatch_queue_t queue = dispatch_queue_create("yd.com.gcd", DISPATCH_QUEUE_SERIAL);
    dispatch_async(queue, ^{
        NSLog(@"_任务1_%@",[NSThread currentThread]);
        dispatch_sync(queue, ^{
            NSLog(@"_任务2_%@",[NSThread currentThread]);
        });
        NSLog(@"_任务3_%@",[NSThread currentThread]);
    });
    NSLog(@"_结束_");
}
/*
死锁:
*/
代码块
代码块
代码块
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,884评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,212评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,351评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,412评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,438评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,127评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,714评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,636评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,173评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,264评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,402评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,073评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,763评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,253评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,382评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,749评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,403评论 2 358

推荐阅读更多精彩内容