多线程几种常用方案

定时器的几种常用方案及原理 常见方案 单机:JDK的Timer、ScheduledThreadPoolExecutor,及Spring的@Scheduled; 分布式:Quartz; JDK Timer   实现原理: 每个定时器实例绑定一个消费线程和任务队列,业务线程提交定时任务到任务队列,任务按照下次执行时间在队列中排序;消费线程每次从队首获取任务,查看是否超过执行时间点,超过则立马执行,否则await等待,如果是周... 阅读详情
1.GCD 加载图片过程
#import "UIImageView+DispatchLoad.h"  
@implementation UIImageView (DispatchLoad)  
- (void) setImageFromUrl:(NSString*)urlString {  
    [self setImageFromUrl:urlString completion:NULL];  
}  
- (void) setImageFromUrl:(NSString*)urlString   
              completion:(void (^)(void))completion {  
      
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
          
        NSLog(@"Starting: %@", urlString);  
        UIImage *avatarImage = nil;   
        NSURL *url = [NSURL URLWithString:urlString];  
        NSData *responseData = [NSData dataWithContentsOfURL:url];  
        avatarImage = [UIImage imageWithData:responseData];  
        NSLog(@"Finishing: %@", urlString);  
          
        if (avatarImage) {  
            dispatch_async(dispatch_get_main_queue(), ^{  
                self.image = avatarImage;  
            });  
            dispatch_async(dispatch_get_main_queue(), completion);  
        }  
        else {  
            NSLog(@"-- impossible download: %@", urlString);  
        }  
    });     
}  
@end  


2.1 NSThread 有两种直接创建方式:

- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument

+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument

第一个是实例方法,第二个是类方法

1、[NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];2、NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];[myThread start];

例:

//    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(loadUserList) object:nil];

//      [thread start];

//   [NSThread detachNewThreadSelector:@selector(loadUserList) toTarget:self withObject:nil];

   

2.2参数的意义:

selector :线程执行的方法,这个selector只能有一个参数,而且不能有返回值。

target  :selector消息发送的对象

argument:传输给target的唯一参数,也可以是nil

第一种方式会直接创建线程并且开始运行线程,第二种方式是先创建线程对象,然后再运行线程操作,在运行线程操作前可以设置线程的优先级等线程信息

2.3 PS:不显式创建线程的方法:

用NSObject的类方法  performSelectorInBackground:withObject: 创建一个线程:

[Obj performSelectorInBackground:@selector(doSomething) withObject:nil];  

2.4.2线程间通讯

线程下载完图片后怎么通知主线程更新界面呢?

[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];

performSelectorOnMainThread是NSObject的方法,除了可以更新主线程的数据外,还可以更新其他线程的比如:
用:performSelector:onThread:withObject:waitUntilDone: 


3.利用 
NSOperationQueue 线程存储
3.1 建立子类

NSOperationQueue * contactOperationQueue = [[NSOperationQueue alloc] init];

     [contactOperationQueue setMaxConcurrentOperationCount:1];

     DownLocalContact * downloadContact = [[DownLocalContact alloc] initWithDelegate:self];

    [downloadContact setCompletionBlock:^{

                NSLog(@"download and save Data sucess!");

    }];

     [downloadContact setQueuePriority:NSOperationQueuePriorityVeryLow];

      [contactOperationQueue  addOperation :downloadContact];    
3.2 直接引用
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget:self
                                                                           selector:@selector(downloadImage:)
                                                                             object:kURL];
    
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    [queue addOperation:operation];
// Do any additional setup after loading the view, typically from a nib.
}

-(void)downloadImage:(NSString *)url{
    NSLog(@"url:%@", url);
    NSURL *nsUrl = [NSURL URLWithString:url];
    NSData *data = [[NSData alloc]initWithContentsOfURL:nsUrl];
    UIImage * image = [[UIImage alloc]initWithData:data];
    [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
}
-(void)updateUI:(UIImage*) image{
    self.imageView.image = image;
}  
浅谈多线程异步调用获取结果集的几种方式 阅读详情

相关推荐

保姆级教程:在mmdetection中手动计算并可视化P、R、F1值(附完整代码)

本文提供了一份详细的mmdetection教程,指导开发者如何手动计算并可视化精确率(P)、召回率(R)和F1值。通过完整的代码示例和清晰的步骤说明,帮助用户深入理解目标检测模型的性能评估方法,特别适合需要精细分析模型表现的计算机视觉研究人员和工程师。

weixin_29038303的博客 397

java 多线程并行_深入理解 Java 多线程系列(1)——一个简单需求的并行改造 & Java多线程的通信问题...

并发的学习门槛较高,相较单纯的罗列并发编程 API 的枯燥被动学习方式,本系列文章试图用一个简单的栗子,一步步结合并发编程的相关知识分析旧有实现的不足,再实现逻辑进行分析改进,试图展示例子背后的并发工具与实现原理。本文是本系列的第一篇文章,提出了一个简单的业务场景,给出了一个简单的串行实现以及基于原子变量的并发实现,同时详细分析了 Java多线程通信、 Java 内存模型、 happy befor...

weixin_39611510的博客 210

交流伺服电机绝对式位置控制实战指南

伺服电机控制是工业自动化的核心技术之一,其核心原理是通过闭环反馈实现精确位置控制。绝对值编码器作为关键传感器,能提供单圈内的绝对位置信息,避免了增量式编码器的累计误差问题。在工程实践中,电子齿轮比配置、位置环PID调节等技术直接影响系统动态性能。本文以包装机械为典型场景,详细解析了从硬件选型到参数整定的全流程实现方案,特别是针对单圈绝对值编码器初始化和限位保护等易错环节,给出了经过验证的解决方案。通过合理设置17位编码器的电子齿轮比和优化运动控制算法,最终实现了±0.05°的高精度定位。

weixin_42531588的博客 281

iOS多线程基础

基本概念 进程 进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内通过 活动监视器 可以查看 Mac 系统中所开启的进程   线程 进程要想执行任务,必须得有线程,进程至少要有一条线程程序启动会默认开启一条线程,这条线程被称为主线程或UI 线程线程是进程的基本执行单元,进程的所有任务都在线程中执行   多线程 一个

梦还在的博客 345

systrace分析 之 问题初步定位

如下surfaceflinger空缺点,上面对应的bufferTX 中有buffer,但VSYNC-SF 过来后,SurfaceFlinger却没有去取,检查测试app “android.settings”, 也没有GPU completion 时间长的问题,所以该部分可以请SurfaceFlinger的owner 进一步确认为何不取buffer。. GPU拿的是acquireFence HWC拿的是releaseFence, GPU是绘图,HWC是合成显示,这两个是互相等待的关系,

yangzex的专栏 3191

Ansys Circuit新手必看:IBIS模型导入时,Pin Import和Buffer Import到底怎么选?

本文详细解析了Ansys Circuit中IBIS模型导入时Pin Import与Buffer Import的选择策略,帮助SI/PI工程师根据仿真需求做出正确决策。通过对比两种方式的特性差异和应用场景,提供实用的选择指南和性能优化建议,提升信号完整性仿真效率。

weixin_26846533的博客 257

《多线程×时间管理大师》——程序员的并发修炼之路!

线程是操作系统调度的最小单位。简单来说,一个线程就是一个“执行流”,它可以和其他线程同时执行不同的任务。打个比方,如果一个公司去银行办理多个业务,单靠一个人(主线程)效率低下,不如多个员工同时处理各自的事务,这就像我们用多个线程来并发处理不同任务,提高程序效率。更好地利用多核 CPU 的资源提升 IO 密集型程序的响应能力相比多进程更加轻量和高效Java 多线程虽不易,但掌握核心概念之后,其实也没那么难。

Hello World! 576

网络安全 | 企业网络安全的十大挑战及解决方案

网络安全 | 企业网络安全的十大挑战及解决方案,随着信息技术的飞速发展,企业数字化转型进程不断加速,网络安全问题日益成为企业运营与发展面临的关键挑战。本文深入剖析企业网络安全的十大挑战,包括网络攻击日益复杂、数据泄露风险、内部威胁、物联网安全、云安全、合规性要求、移动办公安全、供应链安全、人才短缺以及安全预算有限等,并针对每个挑战详细阐述相应的解决方案,旨在为企业构建全面、有效的网络安全体系提供指导与参考,助力企业在复杂多变的网络环境中保障自身信息资产安全,实现可持续发展。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

java多线程的一些笔记

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34194702的博客 62

Windows 11 安装、使用 Git:下载、安装、概念、命令、分支模型

本文详细介绍了在 Windows 11 系统上安装与使用 Git 的完整流程,涵盖从官方或国内镜像下载安装包、关键安装选项配置,到 Git 核心概念(如工作区、暂存区、分支、远程仓库等)的通俗解释。同时梳理了常用命令与五种主流 Git 分支模型(如 Git Flow、GitHub Flow 等),帮助开发者根据项目规模选择合适的工作流,是面向初学者与进阶用户的实用指南。

寒水馨 · 轻量级技术文档 · hanshuixin.org 2385

【微服务】SpringBoot 4.0 新特性整合项目实战应用详解

SpringBoot 4.0 新特性整合项目实战应用详解

congge 4585

iOS 多线程并发-锁

这个应该是全平台都会遇到的问题了。当某个对象会被多个线程修改的时候,有可能一个线程访问这个对象的时候另一个线程已经把它删掉了,导致 Crash。比较常见的是在网络任务队列里面,主线程往队列里面加入任务,网络线程同时进行删除操作导致挂掉。 例子 这个真要写比较完整的并发操作的例子就有点复杂了。 解决方法 加锁 NSLock 普通的锁,加锁的时候 lock,解锁调用 unloc...

weixin_30521649的博客 100

【深度学习新浪潮】气候预测模型的研发进展一览(2025年版)

模型类型核心优势适用场景不足ARIMA(统计模型)简单高效、可解释性强短期单变量预测非线性、长时依赖建模差随机森林(机器学习)多特征融合、抗噪声中短期多因素预测空间相关性、时序趋势捕捉弱LSTM(深度学习)长时依赖建模、端到端中长期时序预测物理一致性差、数据需求量大物理知情AI物理规律约束、高可靠性极端天气、长期气候变化模型复杂、计算成本高。

专注:太空算力、AI infra、异构调度、大模型成本工程 527

Java并发编程札记-(一)基础-05线程安全问题

在多线程编程中,可能会出现多个线程访问一个资源的情况,资源可以是同一内存区(变量,数组,或对象)、系统(数据库,web services等)或文件等等。如果不对这样的访问做控制,就可能出现不可预知的结果。这就是线程安全问题,常见的情况是“丢失修改”、“不可重复读”、“读‘脏’数据”等等。 目录 线程安全问题 线程安全的实现 线程安全问题 上面简单介绍了什么是线程安全问题,下面具体说

潘威威的博客 1532

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

07.异常与多线程——17——线程、同步

文章目录考点一、线程1.1 多线程原理1.1.1 随机性打印结果1.1.2 多线程内存图解1.2 Thread类的常用方法1.2.1 获取线程名称的方法1.2.2 设置线程名称的方法(了解)1.2.3 sleep1.3 创建多线程程序的第二种方式:实现runnable接口实现步骤:Thread和Runnable的区别实现Runnable接口创建多线程程序的好处:二、同步线程安全问题的概述线程安全问题的代码实现线程安全问题产生的原理解决线程安全问题同步代码块同步技术的原理同步方法静态同步方法Lock锁 考点

qq_36242942的博客 218

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

还在使用SimpleDateFormat?

阅读本文大概需要 3.2 分钟。 前言 日常开发中,我们经常需要使用时间相关类,想必大家对 SimpleDateFormat 并不陌生。主要是用它进行时间的 格式化输出和解析...

114

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

对多线程的理解,IOS中有几种实现多线程的方法

1、好处: 1、使用线程可以把程序中占据时间长的任务放到后台去处理,如图片、视频的下载 2、发挥多核处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好 缺点: 1、大量的线程降低代码的可读性, 2、更多的线程需要更多的内存空间 3、当多个线程对同一个资源出现争夺的时候要注意线程安全的问题。 iOS有三种多线程编程的技术: 1、NSThread(两种创建方式) [NS

西毒 586

Java JUC并发编程 (线程状态 / ReentrantLock / CopyOnWriteArrayList / ConcurrentHashMap / 常用集合类)

文章目录java.util.concurrent线程六种状态java.util.concurrent.locksReentrantLockLocks 和 Synchronized区别集合类不安全List集合VectorCollections.synchronizedListCopyOnWriteArrayList性能比较HashMapHashTableCollections.SynchronizedMapConcurrentHashMap常用集合类CountDownLatchCyclicBarrierSem

ccccrj博客 744

Android中实现多线程的几种方式

通过合理选择多线程方案,可显著提升 App 的响应速度和用户体验,同时避免 ANR(Application Not Responding)问题。,内部通过 HandlerThread 处理异步任务,适合后台执行独立任务。Android 早期提供的异步任务工具,内部封装了线程切换逻辑。Java 并发框架提供的线程池管理,适合需要控制并发数量的场景。实现线程间通信,适用于需要频繁在主线程更新 UI 的场景。类直接创建并启动线程,适用于简单的异步任务。,适用于需要长时间运行的子线程任务。

Ever69的博客 2547

iOS 开发中几种多线程方案

在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案例,在实际使用中感受它们的区别。还有一点需要说明的是,这篇文章将会使用 Swift 和 Objective-c 两种语言讲解,双语幼儿园。OK,let's begin! 概述 这篇文章中,我不会说多线程是什么、线程和进程的区别、多线程有什么用,当然我也不会说什么是串行、什么是并行

Nicholas的专栏 783

iOS中多线程实现方案

iOS中多线程实现方案

安人多梦的博客 676

多线程面试题之多线程有几种实现方案,分别是什么

1.多线程有几种实现方案,分别是什么 两种。 继承Thread类 实现Runnable接口 扩展一种 实现Callable接口。这个得和线程池结合

kaszxc的博客 756

在JAVA多线程有几种方式

当需要创建大量线程时,频繁创建和销毁线程会消耗大量系统资源。线程池通过预先创建一定数量的线程,复用线程执行多个任务,提高性能和资源利用率。方法),通过实现该接口可以定义线程任务,再将任务传递给。类似,但它可以返回任务执行结果,并且能抛出异常。类是 Java 中线程的基础类,通过继承它并重写。方法是线程的入口点,线程启动后会自动执行该方法。包提供的线程池框架实现,核心接口是。适用于需要返回结果的场景,而继承。接口可以获取异步任务的结果。方法可以定义线程执行逻辑。是一个函数式接口(仅含。

2301_81214551的博客 891

多线程创建的几种方式

第一种方式: 创建:编写一个类 MyThread1 (这里只是小生的自定义命名,方便与代码里名称一致)让它继承 Thread 类, 并把需要多线程运行的程序放到 public void run() 方法里。 启动:在主函数中,new 出 MyThread1 类的实例。 运行:调用 MyThread1类的实例的 start() 方法即可。 第二种方式: 创建:编写一个类 MyThrea...

shang_bo_liang的博客 2018
上一篇: GCD多线程应用
下一篇: UITableViewCell自定义分割线
临红尘
博客等级 码龄19年 10粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值