NSOperationQueue线程池应用

#import "ViewController.h"

@interface ViewController ()
{
    NSOperationQueue *_queue;
}
@end

@implementation ViewController

/*
 第二种 多线程技术
 任务 NSOperation 
 NSOperation是一个抽象类(当前类只声明方法不实现,由子类实现方法),创建任务我们需要创建NSOperation的子类对象
 
 创建任务之后,需要把任务放入任务队列/线程池中 才会异步执行任务
 
 */
- (void)viewDidLoad {
    [super viewDidLoad];
    //创建一个线程池
    _queue = [[NSOperationQueue alloc] init];
    
    //设置 最大并发任务的个数
    //最多允许多少个线程同时进行(异步执行)
    _queue.maxConcurrentOperationCount = 2;
    //如果设置为1 那么 线程池中的子任务之间就是串行执行(子线程之间同步)
    
    //第一种任务
    //[self creatOperation1];
    //第二种
    //[self creatBlockOperation];
    
    //第三类
    //直接向线程池 添加 block 任务
    [_queue addOperationWithBlock:^{
        NSLog(@"block任务2");
        for (NSInteger i = 0 ; i < 30; i ++) {
            [NSThread sleepForTimeInterval:0.2];
            NSLog(@"block2:%ld",i);
        }
    }];
    
}
#pragma mark - 带block 的任务
- (void)creatBlockOperation {
    //创建一个block 任务
    NSBlockOperation *blockOp1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"block 任务1");
        for (NSInteger i = 0; i < 10; i++) {
            [NSThread sleepForTimeInterval:0.5];
            NSLog(@"block1:-》i = %ld",i);
        }
    }];
    //任务1结束之后会回调 下面的block
    [blockOp1 setCompletionBlock:^{
        NSLog(@"block 任务1结束");
    }];
    //放入 线程池
    [_queue addOperation:blockOp1];
    
}

#pragma mark - 请求任务
- (void)creatOperation1 {
    //创建一个任务
    NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operation1:) object:@"任务1"];
    
    //[op1 start];任务中start 表示 同步执行
    //要想异步执行任务 需要放入线程池中 ,一旦放入线程池会立即异步执行
    [_queue addOperation:op1];
    
    //多增加几个任务
    NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operation2:) object:@"任务2"];
    //放入线程池
    [_queue addOperation:op2];
    
    NSInvocationOperation *op3 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operation3:) object:@"任务3"];
    //放入线程池
    [_queue addOperation:op3];
}
- (void)operation1:(id)obj {
    NSLog(@"func:%s obj:%@",__func__,obj);
    for (NSInteger i = 0; i < 10; i++) {
        NSLog(@"i:%ld",i);
        [NSThread sleepForTimeInterval:0.5];
    }
    NSLog(@"任务1即将结束");
}
- (void)operation2:(id)obj {
    NSLog(@"func:%s obj:%@",__func__,obj);
    for (NSInteger i = 0; i < 10; i++) {
        NSLog(@"i:%ld",i);
        [NSThread sleepForTimeInterval:0.5];
    }
    NSLog(@"任务2即将结束");
}
- (void)operation3:(id)obj {
    NSLog(@"func:%s obj:%@",__func__,obj);
    for (NSInteger i = 0; i < 10; i++) {
        NSLog(@"i:%ld",i);
        [NSThread sleepForTimeInterval:0.5];
    }
    NSLog(@"任务3即将结束");
}

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

@end
时间: 2024-12-16 23:03:00

NSOperationQueue线程池应用的相关文章

Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? Java new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } }).start(); 1 2 3 4 5 6 7 new Thread(new

线程的控制和线程池

一.WaitHandle: ”.Net 中提供了一些线程间更自由通讯的工具,他们提供了通过"信号"进行通讯的机制 可以通过ManualResetEvent,AutoResetEvent(他是在开门并且一个 WaitOne 通过后自动关门)来进行线程间的通讯 waitOne:    等待开门 Set:           开门 Reset:       关门 static void Main(string[] args) { ManualResetEvent mre = new Manu

内存池、进程池、线程池

首先介绍一个概念"池化技术 ".池化技术 一言以蔽之就是:提前保存大量的资源,以备不时之需以及重复使用. 池化技术应用广泛,如内存池,线程池,连接池等等.内存池相关的内容,建议看看Apache.Nginx等开源web服务器的内存池实现. 起因:由于在实际应用当中,分配内存.创建进程.线程都会设计到一些系统调用,系统调用需要导致程序从用户态切换到内核态,是非常耗时的操作.           因此,当程序中需要频繁的进行内存申请释放,进程.线程创建销毁等操作时,通常会使用内存池.进程池.

缓冲池,线程池,连接池

SSH:[email protected]:unbelievableme/object-pool.git   HTTPS:https://github.com/unbelievableme/object-pool.git 缓冲池 设计要点:包含三个队列:空缓冲队列(emq),装满输入数据的输入的队列(inq),装满输出数据的输出队列(outq),输入程序包括收容输入(hin),提取输入(sin),输出程序包括收容输出(hout)和提取输出(sout). 注意点:输入程序和输出程序会对缓冲区并发访

记5.28大促压测的性能优化&mdash;线程池相关问题

目录: 1.环境介绍 2.症状 3.诊断 4.结论 5.解决 6.对比java实现 废话就不多说了,本文分享下博主在5.28大促压测期间解决的一个性能问题,觉得这个还是比较有意思的,值得总结拿出来分享下. 博主所服务的部门是作为公共业务平台,公共业务平台支持上层所有业务系统(2C.UGC.直播等).平台中核心之一的就是订单域相关服务,下单服务.查单服务.支付回调服务,当然结算页暂时还是我们负责,结算页负责承上启下进行下单.结算.跳支付中心.每次业务方进行大促期间平台都要进行一次常规压测,做到心里

线程池的创建

package com.newer.cn; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Test1 { public static void main(String[] args) { // 创建线程池的方式 // 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程,在需要时使用提供的 ThreadFactory 创建新线程. E

Java底层技术系列文章-线程池框架

一.线程池结构图    二.示例 定义线程接口 public class MyThread extends Thread { @Override publicvoid run() { System.out.println(Thread.currentThread().getName() + "正在执行"); }}   1:newSingleThreadExecutor ExecutorService pool = Executors. newSingleThreadExecutor()

线程池中的线程的排序问题

1 package org.zln.thread.poolqueue; 2 3 import org.slf4j.Logger; 4 import org.slf4j.LoggerFactory; 5 6 import java.util.Comparator; 7 import java.util.UUID; 8 import java.util.concurrent.*; 9 10 /** 11 * 线程池中的线程的排序问题 12 * Created by sherry on 16/11/4

多线程篇七:通过Callable和Future获取线程池中单个务完成后的结果

使用场景:如果需要拿到线程的结果,或者在线程完成后做其他操作,可以使用Callable 和 Futrue 1.定义一个线程池,向线程池中提交单个callable任务 ExecutorService threadPools=Executors.newSingleThreadExecutor(); Future<String> future=threadPools.submit(new Callable<String>() { @Override public String call(