多线程一些理解

iOS多线程几种实现方案

1.pthread .   C语言但是使用难度大,用于Windows,Linux等平台,几乎不用

2.NSThread       OC 简单易用,直接操作线程对象,但是偶尔使用。

3.GCD    C语言  是为了替代NSThread等线程计数,充分利用设备多核,自动管理所以经常使用。

4.NSOperation   OC语言,基于GCD 自动管理,所以也是经常使用。

1.在pthread中要实现它的子线程,导入<pthread.h>,pthread_t thread;pthread_create($thread,NULL,函数名,NULL);实现函数方法,比如void * run(void *param){for 循环一下,return NULL;}

2.NSThread

首先是创建线程

- (void)viewDidLoad {
    [super viewDidLoad];
    NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(run:) object:nil];
    [thread start];
}
-(void)run:(NSString *)param{
    for (int i=0; i<10000; i++) {
        NSLog(@"%@--%@",param,[NSThread currentThread].name);
    }
}

启动线程

还有一种创建线程的方式

[self performSelectorInBackground:(nonnull SEL) withObject:(nullable id)] 

[self performSelectorOnMainThread:(nonnull SEL) withObject:(nullable id) waitUntilDone:(BOOL)]

以上都不是很完美的方式

/*******************************************************/

3.GCD


全称:Grand Central Dispatch  牛逼的中枢调度器

为多核并行解决方案,自动利用CPU内核。自动管理生命周期,不需要编写任何线程管理代码

两个核心概念:任务和队列

两个步骤:定制任务和添加任务

  //异步 具备开启新线程的能力
    dispatch_async(dispatch_queue_t queue, ^{
        code
    })
    //同步
    dispatch_sync(dispatch_queue_t queue, ^{
        code
    })

queue 队列   block 任务

GCD队列的两大类型

并发队列 只有在异步才有效,多个任务并发执行

串行队列  一个任务完成后,才开始执行下一个任务

创建并发队列

dispatch_queue_t queue = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)

多线程安全隐患

1.多个线程可能会访问同一块资源。比如多个线程访问同一个对象,同一个变量和文件。想象存钱和取钱的例子。会覆盖之前的数据,无法实时更新提示。

2.解决方案就是加一把锁。互斥锁。等一个线程访问完毕后就解除锁。@synchronized(锁对象self)但是它会消耗大量CPU资源。不建议使用

原子核非原子属性

nonatomic

非线程安全,适合内存小的移动设备,所以所有的属性声明都是nonatomic

尽量避免多线程抢夺同一资源

atomic

原子属性 为setter方法,需要消耗大量资源

线程之间的通信

一个进程中,线程不是孤立 的,多个线程之间需要通信,比如在主线程中我们添加UI控件,图片等,在子线程中下载图片,下载完毕之后,要在主线程中显示图片

时间: 2024-12-17 03:50:34

多线程一些理解的相关文章

(转载)Java多线程入门理解

转载出处http://blog.csdn.net/evankaka 写在前面的话:此文只能说是java多线程的一个入门,其实Java里头线程完全可以写一本书了,但是如果最基本的你都学掌握好,又怎么能更上一个台阶呢?如果你觉得此文很简单,那推荐你看看Java并发包的的线程池(Java并发编程与技术内幕:线程池深入理解),或者看这个专栏:Java并发编程与技术内幕.你将会对Java里头的高并发场景下的线程有更加深刻的理解. 目录(?)[-] 一扩展javalangThread类 二实现javalan

有关JAVA多线程的理解

不同于c++等语言的调用操作系统的线程调控机制来实现多线程,java语言内置了多线程的api包,因此可以更加方便的使用多线程技术.(1)线程的问题.进程是程序的一次动态执行过程,它对应了从代码加载.执行至执行完毕的一个完整过程,这个过程也是进程本身从产生.发展至消亡的过程.线程是比进程更小的单位,一个进程执行过程中可以产生多个线程,每个线程有自身的产生.存在和消亡的过程,也是一个动态的概念.每个进程都有一段专用的内存区域,而线程间可以共享相同的内存区域(包括代码和数据),并利用这些共享单元来实现

synchronized与static synchronized 的差别、synchronized在JVM底层的实现原理及Java多线程锁理解

本Blog分为例如以下部分: 第一部分:synchronized与static synchronized 的差别 第二部分:JVM底层又是怎样实现synchronized的 第三部分:Java多线程锁,源码剖析 第一部分:synchronized与static synchronized的差别 1.synchronized与static synchronized 的差别 synchronized是对类的当前实例进行加锁,防止其它线程同一时候訪问该类的该实例的全部synchronized块.注意这里

synchronized与static synchronized 的区别、synchronized在JVM底层的实现原理及Java多线程锁理解

本Blog分为如下部分: 第一部分:synchronized与static synchronized 的区别 第二部分:JVM底层又是如何实现synchronized的 第三部分:Java多线程锁,源代码剖析 第一部分:synchronized与static synchronized的区别 1.synchronized与static synchronized 的区别 synchronized是对类的当前实例进行加锁,防止其他线程同时访问该类的该实例的所有synchronized块,注意这里是"类

对Servlet单实例多线程的理解。

0 Servlet如何处理多个请求访问? Servlet容器默认是采用单实例多线程的方式处理多个请求的: Servlet是单实例多线程运行方式,所以对象变量线程不安全,局部变量线程安全的. 1.当web服务器启动的时候(或客户端发送请求到服务器时),Servlet就被加载并实例化(只存在一个Servlet实例): 2.容器初始化化Servlet主要就是读取配置文件(例如tomcat,可以通过servlet.xml的<Connector>设置线程池中线程数目,初始化线程池通过web.xml,初始

我对多线程的理解和分类

一.多线程的定义和使用信息: 多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径 在系统级别内,程序并排执行,程序分配到每个程序的执行时间是基于该程序的所需时间和其他程序的所需时间来决定的. 然而,在每个程序内部,存在一个或者多个执行线程,它同时或在一个几乎同时发生的方式里执行不同的任务. 概要提示: iPhone中的线程应用并不是无节制的,官方给出的资料显示,iPhone OS下的主线程的堆栈大小是1M,第二个线程开始就是512KB,并且该值不能通过编译器开关或线程API函数来更

JavaScript可否多线程? 深入理解JavaScript定时机制

http://www.phpv.net/html/1700.html JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( function(){ alert(’你好!’); } , 0); setInterval( callbackFunction , 100); 认为setTimeout中的问候方法会立即被执行,因为这并不是凭空而说,而是Java

Java多线程深入理解

在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 对于直接继承Thread的类来说,代码大致框架是: ? 1 2 3 4 5 6 7 8 9 10 11 class 类名 extends Thread{  方法1;  方法2:  -  public void run(){  // other code-  }  属性1:  属性2:  -  }  先看一个简单的例子: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Python多线程的理解和使用(一)Threading中join()函数的理解

1. 多线程的概念 多线程类似于同时执行多个不同程序,多线程运行有如下优点: 使用线程可以把占据长时间的程序中的任务放到后台去处理.用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度 程序的运行速度可能加快在一些等待的任务实现上如用户输入.文件读写和网络收发数据等,线程就比较有用了.在这种情况下我们可以释放一些珍贵的资源如内存占用等等.线程在执行过程中与进程还是有区别的.每个独立的线程有一个程序运行的入口.顺序执行序列和程序的出口.但是线程

IOS多线程-个人理解

一.多线程 每一个iOS应用程序中都有一个主线程用来更新UI界面.处理用户的触摸事件.解析网络下载的数据,因此不能把一些太耗时的操作(比如网络下载数据)放在主线程中执行,不然会造成主线程堵塞(出现界面卡死,防止界面假死),带来极坏的用户体验. iOS的解决方案就是将那些耗时的操作放到另外一个线程中去执行,多线程异步编程是防止主线程堵塞,增加运行效率的最佳方法 异步:多个线程 同时执行 同步:线程排队执行并行 ->异步串行->同步 多线程技术 1.异步下载数据,是多线程技术的一个比较常见的应用场