线程间的通信

striveld striveld     2023-01-15     601

关键词:

在一个进程中,线程往往不是孤立存在的,多个线程之间要经常进行通信,成为线程间的通信。

线程间的通信主要体现在,一个线程执行完特定任务后,转到另一个线程去执行任务,在转换任务的同时,将数据也传递给另外一个线程。

NSThread类提供了两个比较常用的方法,用于实现线程间的通信,这两个方法的定义格式如下:

-(void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
-(void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;
在上述定义的格式中,第一个方法是将指定的方法放在主线程中运行。其中,aSelector就是在主线程中运行的方法,参数arg是当前执行方法所在的线程传递给主线程的参数,参数waitUntilDone是一个布尔值,用来指定当前线程是否阻塞,当为YES的时候会阻塞当前线程,直到主线程执行完毕后才执行当前线程;当为NO的时候,则不阻塞这个线程。
第二个方法是创建一个子线程,将指定的方法放在子线程中运行。

下面通过一个使用多线程下载网络图片的案例,展示如何实现线程间的通信:

1、新建一个Single View Application 应用,名称为03-ThreadContact;

2、进入Main.StoryBoard,从对象库拖拽一个ImageView到程序界面,用于显示要下载的图片,设置Mode模式为Center,最后给Image View设置一个背景颜色;

3、通过拖拽的方式,将ImageView在viewController.m文件的类扩展中进行属性的声明;

4、单击模拟器的屏幕,开始下载图片,并将下载完成的图片显示到ImageView上。

注意:程序如果直接在主线程中访问网络数据,由于网络速度的不稳定性,一旦网络传输速度较慢时,容易造成主线程的阻塞,从而导致应用程序失去响应。因此需要将网络下载图片这样耗时的操作放到子线程中,等下载完成后,通知主线程刷新视图,显示图片。

整个程序的代码如下:

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *HM;

@end

@implementation ViewController
// 单击屏幕
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

[self performSelectorInBackground:@selector(download) withObject:nil];

//下载图片
-(void)download

NSLog(@"download---%@",[NSThread currentThread]);
//1.图片地址
NSString *[email protected]"https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1206121028,2489642848&fm=27&gp=0.jpg";
NSURL *url=[NSURL URLWithString:urlStr];
// 2.根据地址下载图片的二进制数据(这句代码最耗时)
NSData *data=[NSData dataWithContentsOfURL:url];
//3.设置图片
UIImage *image=[UIImage imageWithData:data];
//4.回到主线程,刷新UI界面(为了线程安全)
if(image!=nil)

[self performSelectorOnMainThread:@selector(downloadFinished:) withObject:image waitUntilDone:NO];

else

NSLog(@"图片下载出现错误!");


//下载完成
-(void)downloadFinished:(UIImage *)image

self.HM.image=image;
NSLog(@"downloadFinished---%@",[NSThread currentThread]);


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

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


@end
代码中,performSelectorInBackground: withObject:方法创建子线程,并指定了download方法来下载图片,后面调用

performSelectorOnMainThread: withObject: waitUntilDone:来到主线程,在主线程中刷新视图。

运行程序,程序运行成功后,单击屏幕,就成功下载了图片,模拟器的结果如下:
     

控制台输出结果如下:

 


---------------------
作者:ChunxueShi
来源:CSDN
原文:https://blog.csdn.net/shichunxue/article/details/78481428
版权声明:本文为博主原创文章,转载请附上博文链接!





























































java基础教程:多线程基础——线程间的通信

Java基础教程:多线程基础(2)——线程间的通信使线程间进行通信后,系统之间的交互性会更强大,在大大提高CPU利用率的同时还会使程序员对各线程任务在处理的过程中进行有效的把控与监督。线程间的通信思维导图 等... 查看详情

线程间的通信同步方式与进程间通信方式

1.线程间的通信方式1)使用全局变量(由于多个线程可能更改全局变量,因此全局变量最好声明为volatile)2)使用消息实现通信 3)使用事件CEvent类实现线程间的通信2.同步/异步(C端)同步:在C端发出一个功能调用时,没有得到结果之前... 查看详情

多线程-线程间的通信(代码片段)

线程间的通信线程通信就是线程与线程间进行信息的交换。这里可以举个例子,两个线程交替的打印0-9这10个数字。首先分析一下,比如线程一先开始打印,当它打印了数字0后,他应该等待线程二打印数字1,线程二打印了之后... 查看详情

线程间的通信同步方式与进程间通信方式

线程间的通信、同步方式与进程间通信方式说到线程之间通信方式:依据我的理解主要是有两种吧 1.是通过共享变量,线程之间通过该变量进行协作通信; 2.通过队列(本质上也是线程间共享同一块内存)来实现消费者... 查看详情

线程间的通信共享数据安全问题

1//线程间的通信:线程的任务不同,但是线程操作的数据相同。23//描述数据4classResource5{6publicStringname;7publicStringgender;8publicResource(){}9}1011//描述输入任务12classInputimplementsRunnable13{14privateResourceres;15publicInput(Resourc 查看详情

线程__线程间的通信

线程间的通信:多个线程在处理同一资源,但是任务却不同。一、等待唤醒机制涉及的方法:1.wait();让线程处于冻结状态,被wait的线程会被存储到线程池中2.notify();唤醒线程池中的一个任意线程3.notifyAll();唤醒线程池中的所有线... 查看详情

java学习---线程间的通信

【原文】https://www.toutiao.com/i6572378564534993415/两个线程间的通信这是我们之前的线程。执行效果:谁抢到资源,谁运行~实现线程交替执行:这里主要用到了两个内容1)创建一个标记flag,让程序进行判断:当flag!=1时,print1进入等... 查看详情

多线程线程间的通信和协作

...团队各个成员之间密切配合一样。而对于系统中的各个子线程来说,如果要完成一个系统功能,同样需要各个线程的配合,这样就少不了线程之间的通信与协作。常见的线程之间通信方式有如下几种:  1、wait和notify/notifyAll ... 查看详情

wait/notify实现线程间的通信(代码片段)

  使线程之间进行通信之后,系统间的交互性更加强大,在大大提高CPU利用率的同时还会使程序对各线程任务在处理的过程中进行有效的把控与监督。1.不使用wait/notify实现线程间通信    使用sleep()+while(true)也可以实... 查看详情

多线程---线程间的通信

1.wait()方法使当前执行代码的线程进行等待,将当前线程置入"预执行队列",并且在wait()方法所在处停止执行,直到接到通知或者中断。 在调用wait之前,线程必须获得该对象的对象级别锁,即只能在同步方法或者同步代码块中... 查看详情

线程间的通信--等待唤醒机制

1.多个线程操作相同的资源,但是操作动作不同,所以存在安全问题例如:publicclassTest{publicstaticvoidmain(String[]args){Resourcer=newResource();Inputin=newInput(r);Outputout=newOutput(r);Threadtin=newThread(in);Threadtout=newThread(out 查看详情

java线程间的通信方式

1.同步  synchronized 2.轮询  while  volatile 3.wait/notify机制  syncrhoized加锁的线程的Object类的wait()/notify()/notifyAll()  ReentrantLock类加锁的线程的Condition类的await()/signal()/signalAll() 4.管 查看详情

多线程编程--part4线程间的通信

线程间的相互作用  线程之间需要一些协调通信,来共同完成一件任务。  Object类相关的方法:notify(),notifyAll(),wait()。会被所有的类继承,这些方法是final不能被重写。他们操控的是每个对象都会有的锁,如果不在synchronize... 查看详情

进程间的几种通信方式的比较和线程间的几种

...的通信。(2)信号量是一个计数器,可以用来控制多个线程对共享资源的访问,它不是用于交换大批数据,而用于多线程之间的同步。他常作为一种锁机制。因此,主要作为进程间以及同一个进程内不同线程之间的同步手段。... 查看详情

进程通信,线程通信,同步方式

一、进程间通信进程间的通信,它的数据空间的独立性决定了它的通信相对比较复杂,需要通过操作系统。以前进程间的通信只能是单机版的,现在操作系统都继承了基于套接字(socket)的进程间的通信机制。这样进程间的通信... 查看详情

多线程-线程间的通信(代码片段)

线程间的通信线程通信就是线程与线程间进行信息的交换。这里可以举个例子,两个线程交替的打印0-9这10个数字。首先分析一下,比如线程一先开始打印,当它打印了数字0后,他应该等待线程二打印数字1,线程二打印了之后... 查看详情

线程之间的通信

线程通信概念:线程是操作系统中独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体,线程间的通信就成为整体的必用方法之一。当线程存在通信指挥,系统间的交互性会更强大,在提高CPU利用率的同时还会使开发人... 查看详情

07-sv线程以及线程间的通信

...式执行(3)fork……join_none:其块内语句执行时,父线程继续执行(4)fork……join_any:其块内第一个语句完成后,父线程才继续执行,其他停顿的线程也得以继续在并发线程中务必使用自动变量来保存数值 查看详情