GCD 实现生产-消费 模式

#import "ViewController.h"

@interface ViewController (){

}
@property (nonatomic,strong)    dispatch_semaphore_t sema;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

     _sema = dispatch_semaphore_create(1);
    dispatch_group_t group = dispatch_group_create();
    dispatch_queue_t queue = dispatch_queue_create("custom_dis", 0);

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        if (![[NSThread currentThread]  isMainThread]) {
            NSLog(@"===异步线程===============");
        }

         for (int i = 0; i<10; i++) {

             dispatch_semaphore_wait(_sema, DISPATCH_TIME_FOREVER);

             dispatch_group_async(group, queue, ^{
                 if (![[NSThread currentThread]  isMainThread]) {
                     NSLog(@"===异步线程===============");
                 }

                 [self doCustomSomting];

             });

         }

     });

    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

}

-(void)doCustomSomting{

    sleep(2);

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        if (![[NSThread currentThread]  isMainThread]) {
            NSLog(@"===异步线程===============");
        }
        sleep(1);

        dispatch_async(dispatch_get_main_queue(), ^{

            if ([[NSThread currentThread]  isMainThread]) {
                NSLog(@"===主线程===============");
            }
            NSLog(@"=====compeletSomting=========");

            dispatch_semaphore_signal(_sema);

        });

    });

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
时间: 2024-08-10 19:19:11

GCD 实现生产-消费 模式的相关文章

day11(多线程,唤醒机制,生产消费者模式,多线程的生命周期)

A:进程: 进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. B:线程: 线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程.一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序. C:简而言之: 一个程序运行后至少有一个进程,一个进程中可以包含多个线程 线程实现 实现的两种方式 继承Thread public class MyThread extends Thread{ @Ove

RabbitMQ下的生产消费者模式与订阅发布模式

??所谓模式,就是在某种场景下,一类问题及其解决方案的总结归纳.生产消费者模式与订阅发布模式是使用消息中间件时常用的两种模式,用于功能解耦和分布式系统间的消息通信,以下面两种场景为例: 数据接入 ??假设有一个用户行为采集系统,负责从App端采集用户点击行为数据.通常会将数据上报和数据处理分离开,即App端通过REST API上报数据,后端拿到数据后放入队列中就立刻返回,而数据处理则另外使用Worker从队列中取出数据来做,如下图所示. ??这样做的好处有:第一,功能分离,上报的API接口不关心

3、传统线程同步与通信--生产消费例子

核心点: 1.锁对象必须是同一个. 2.wait()和notify()方法必须是调用锁对象的方法,而非this(线程)的. 3.在多生产多消费的时候注意使用notifyAll而不是notifyAll,否则会造成死锁 测试代码: 1 import java.util.LinkedList; 2 import java.util.Queue; 3 import java.util.Random; 4 5 /** 6 * 多个生产 - 消费 线程同步通信 7 * 核心点: 8 * 1.锁对象必须是同一

生产消费者模式,并不是高并发模式

我为什么说生产消费者模式,并不是高并发模式?因为高并发的关键因素是数据分割,不是通信.生产消费者模式只是一个异步数据通信模式.对并发性能的提高有限. 为什么数据分割对并发性能影响这么大? 首先,我们需要说一说硬件cpu,毕竟软件最后是cpu来执行.我们的目标是让代码性能尽可能的高.更详细的表述,就是让代码最大限度的发挥cpu的性能.现在的电脑.手机都已经全部是多核cpu了.所以,表述就是让代码最大限度的发挥多核cpu的性能.最大限度的发挥多核cpu的性能,需要我们尽可能的保证代码的高并行度.高并

【JAVA】wait和notify用法,附生产/消费模型

关于wait和notify的用法,网上已经有很多详细解释了,我只是简单的总结下. wait用于释放锁A,并让wait所在的线程阻塞.除非被持有锁A的其它线程执行notify来唤醒,它才能重新"活"过来. notify用于唤醒因为等待锁A而阻塞的线程,让它们做好竞争锁A的准备.如果有多个线程因等待锁A而被阻塞,notify只唤醒一个,唤醒所有用notifyAll. 参考下面的线程状态图,对理解wait和notify有很大的帮助. 总结: wait和notify通常和synchronize

Java生产消费模型—ArrayBlockingQueue详解

背景需求 生产消费模型是线程协作关系中十分常见的一种.通常,一个(多个)线程负责生产,一个(多个)线程可以从生产的列表中获取并消费:生产的内容可以按需求设计,可以是一个Integer,可以是String,可以Object,也可以是任意类型的对象,只要有生产消费的需求. 例如,厨师负责生产美食,放在桌子上,服务员负责取走(消费)美食.这里,厨师就扮演着生产者的身份,美食是生产的内容,服务员就扮演着消费者的身份. 下面用这个厨师与服务员的案例来分析下生产消费模型需要实现哪些功能才能满足需求: 如何实

生产消费锁---信号灯模式

package com.Thread; public class Custom_Producer { public static void main(String[] args) { //共享资源 Production pro = new Production(); Custom custom = new Custom(pro); Producer producer = new Producer(pro); new Thread(producer).start(); new Thread(cus

【并发】9、借助redis 实现生产消费,消息订阅发布模式队列

这个就是一个消息可以被多次消费的范例了 其实这个实现的方式可以参考我之前的设计模式,观察者模式 https://www.cnblogs.com/cutter-point/p/5249780.html 不过有一点需要注意一下啊,这个消息发布的时候,好像是不支持字节数据的,里面好像会对字节进行转换,这样的结果就是导致我最后无法吧相应的字节转换成我之前序列化的对象 不知道是不是ObjectInputStream和ObjectOutputStream实现不是很好的原因,还是什么,反正反序列化的时候,有些

多线程:简易版本生产消费者模式纯语言概述

一个消费者,一个生产者,一共就两个线程 首先用最简单的语言描述一下这个模型对象为 资源对象,资源对象包括了生产方法,和消费方法,以及计数器生产者对象,只会生产消费者对象,只会销售生产者.消费者实现了Runnable接口,同时拥有一个资源字段和为资源字段构造函数主函数New了一个资源对象New了一个生产者,消费者分别放入一个Thread中执行,结果很可能生产者执行一半,消费者就来执行了,为了避免这种情况为共享数据部分加入Synchronized关键字,进行同步处理但是还有一个问题,生产者,消费者,