多线程

iOS多线程之GCD详解

◇◆丶佛笑我妖孽 提交于 2020-03-08 10:02:49
GCD(Grand Central Dispatch)是基于C语言开发的一套多线程开发机制。也是目前苹果官方推荐的多线程开发方法。iOS三种多线程开发中GCD是抽象层次最高的。当然用起来也是最简单的。只是它基于C语言开发。并不像NSOperation是面向对象的开发。而是完全面向过程的。这种机制相比较于前面两种多线程开发方式最明显的优点就是它对于多核运算更佳有效。 GCD中也有一个类似于NSoperationQueue的队列,GCD统一管理整个队列中的任务。但是GCD中的队列氛围并行队列和串行队列两类。   串行队列:只有一个线程,加入到队列中的操作按添加顺序依次执行。   并发队列:有多个线程,操作进来之后他会将这些队列安排到可用的处理器上。同时保证先进来的任务优先处理。 其实在GCD中还有一个特殊的队列就是主队列,用来执行主线程上的操作任务。(从前面的演示中可以看到其实在NSOperation中也有一个主队列) 串行队列 使用串行队列时首先要创立一个串行队列,然后调用异步调用方法,在此方法中传入串行队列和线程操作即可自动执行。下面就是一个例子。 #define ROW_COUNT 5 #define COLUMN_COUNT 3 #define ROW_HEIGHT 100 #define ROW_WIDTH ROW_HEIGHT #define CELL_SPACING 10

iOS多线程

不想你离开。 提交于 2020-03-08 10:02:07
/*--> */ /*--> */ https://www.jianshu.com/p/0b0d9b1f1f19 Pthreads NSThread GCD NSOperation & NSOperationQueue 线程同步、 延时执行、 单例模式 1 、 Pthreads : POSIX 线程 pthread_create(&thread, NULL, start, NULL); 2 、 NSThread 1— 先创建线程类,再启动 // 创建 NSThread *thread = [[ NSThread alloc] initWithTarget: self selector: @selector (run:) object:nil]; // 启动 [thread start]; 2- 创建并自动启动 [ NSThread detachNewThreadSelector: @selector (run:) toTarget: self withObject:nil]; 3- NSObject 的方法创建并自动启动 [ self performSelectorInBackground: @selector (run:) withObject:nil]; 3 、 GCD 任务 和 队列 同步( sync ) 和 异步( async ) 会不会阻塞当前线程,直到 Block

关于iOS多线程的总结

笑着哭i 提交于 2020-03-08 10:01:16
关于iOS多线程的总结 在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项。当然也会给出几种多线程的案例,在实际使用中感受它们的区别。还有一点需要说明的是,这篇文章将会使用 Swift 和 Objective-c 两种语言讲解,双语幼儿园。OK,let's begin! 概述 这篇文章中,我不会说多线程是什么、线程和进程的区别、多线程有什么用,当然我也不会说什么是串行、什么是并行等问题,这些我们应该都知道的。 在 iOS 中其实目前有 4 套多线程方案,他们分别是: Pthreads NSThread GCD NSOperation & NSOperationQueue 所以接下来,我会一一讲解这些方案的使用方法和一些案例。在将这些内容的时候,我也会顺带说一些多线程周边产品。比如: 线程同步 、 延时执行 、 单例模式 等等。 Pthreads 其实这个方案不用说的,只是拿来充个数,为了让大家了解一下就好了。百度百科里是这么说的: POSIX线程(POSIX threads),简称Pthreads,是线程的POSIX标准。该标准定义了创建和操纵线程的一整套API。在类Unix操作系统(Unix、Linux、Mac OS X等)中,都使用Pthreads作为操作系统的线程。 简单地说,这是一套在很多操作系统上都通用的多线程API,所以移植性很强

iOS多线程开发(三)---Run Loop(二,三)

不羁的心 提交于 2020-03-08 09:53:08
二,何时使用Run Loop 对于辅助线程,在需要和线程有更多交互时,才使用Run Loop。 比如:1)使用端口或者自定义输入源来和其他线程通讯 2)使用线程定时器 3)Cocoa中使用任何performSelector...的方法(参考 Table: Performing selectors on other threads) 4)使线程周期性工作 三,如何使用Run Loop对象 Run Loop对象提供了 添加输入源,定时器和Run Loop的观察者以及启动Run Loop 的接口,使用Run Loop包活获取--配置--启动--退出四个过程 1,获取Run Loop的对象 A,通过NSRunLoop获取 // 获得当前thread的Run loop NSRunLoop *myRunLoop = [NSRunLoop currentRunLoop]; // 将Cocoa的NSRunLoop类型转换程Core Foundation的CFRunLoopRef类型 CFRunLoopRef ç = [myRunLoop getCFRunLoop]; B,使用CFRunLoopGetCurrent()函数 2,配置Run Loop 所谓配置Run Loop主要是给Run Loop添加输入源,定时器或者添加观察者,即设置Run Loop模式。上面函数- (void

Java自学-多线程 原子访问

試著忘記壹切 提交于 2020-03-08 09:48:26
多线程 原子访问 步骤 1 : 原子性操作概念 所谓的 原子性操作 即不可中断的操作,比如赋值操作 int i = 5; 原子性操作本身是线程安全的 但是 i++ 这个行为,事实上是有3个原子性操作组成的。 步骤 1. 取 i 的值 步骤 2. i + 1 步骤 3. 把新的值赋予i 这三个步骤,每一步都是一个原子操作,但是合在一起,就不是原子操作。就 不是线程安全 的。 换句话说,一个线程在步骤1 取i 的值结束后,还没有来得及进行步骤2,另一个线程也可以取 i的值了。 这也是分析同步问题产生的原因 中的原理。 i++ ,i--, i = i+1 这些都是非原子性操作。 只有int i = 1,这个赋值操作是原子性的。 步骤 2 : AtomicInteger JDK6 以后,新增加了一个包 java.util.concurrent.atomic ,里面有各种原子类,比如 AtomicInteger 。 而AtomicInteger提供了各种自增,自减等方法,这些方法都是原子性的。 换句话说,自增方法 incrementAndGet 是线程安全的,同一个时间,只有一个线程可以调用这个方法。 package multiplethread; import java.util.concurrent.atomic.AtomicInteger; public class

多线程(三)-- 线程安全问题

社会主义新天地 提交于 2020-03-08 07:53:13
安全解决 -- 互斥锁 @synchronized(self) { //开始加锁,操作 } 优: 解决多线程抢夺资源产生的数据安全问题 缺: 消耗CPU资源多 使用前提: 多条线程执行一块代码时加锁 线程同步:@synchronized() 多条线程在同一条线上执行(按顺序执行,与线程并发不同) nonatomic 与 atomic atomic保护线程安全,自动加锁 为setter加锁 对比 atomic:线程安全,消耗大量资源 nonatomic:非线程安全,适合内存小的移动设备 来源: https://www.cnblogs.com/fangchun/p/4684910.html

Python-多线程

只愿长相守 提交于 2020-03-08 04:35:50
导入包 import threading 定义多线程: 线程1=threading . Thread(target=函数名,name = ‘线程名字’,arsg=(参数1,参数2))- 启动线程: 线程1.start() def job1 ( ) : print ( 'T1 start\n' ) for i in range ( 10 ) : time . sleep ( 0.1 ) print ( 'T1 finish\n' ) def main ( ) : thread_job1 = threading . Thread ( target = job1 , name = 'T1' ) #创建一个多线程 thread_job1 . start ( ) #激活一个多线 print ( threading . active_count ( ) ) #线程的数量 print ( '*' * 59 ) print ( threading . enumerate ( ) ) print ( '*' * 59 ) print ( threading . current_thread ( ) ) #运行的是哪个线程 #结果 T1 start 3 ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** **

Java线程池使用和常用参数

北战南征 提交于 2020-03-07 12:02:18
多线程问题: 1、java中为什么要使用多线程 使用多线程,可以把一些大任务分解成多个小任务来执行,多个小任务之间互不影像,同时进行,这样,充分利用了cpu资源。 2、java中简单的实现多线程的方式 继承Thread类,重写run方法; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 class MyTread extends Thread{ public void run() {   System.out.println(Thread.currentThread().getName()); } } 实现Runable接口,实现run方法; class MyRunnable implements Runnable{    public void run() {     System.out.println(Thread.currentThread().getName());   } } class ThreadTest {    public static void main(String[] args) {     MyTread thread = new Mythread();     thread.start(); //开启一个线程     MyRunnable

java 多线程 基础总结

梦想与她 提交于 2020-03-07 09:59:34
Java多线程实例 3种实现方法 Java中的多线程有三种实现方式: 1.继承Thread类,重写run方法。Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法。 2.实现Runnable接口,并实现该接口的run()方法.创建一个Thread对象,用实现的Runnable接口的对象作为参数实例化Thread对象,调用此对象的start方法。 3.实现Callable接口,重写call方法。Callable接口与Runnable接口的功能类似,但提供了比Runnable更强大的功能。有以下三点 1).Callable可以在人物结束后提供一个返回值,Runnable没有提供这个功能。 2).Callable中的call方法可以抛出异常,而Runnable的run方法不能抛出异常。 3).运行Callable可以拿到一个Future对象,表示异步计算的结果,提供了检查计算是否完成的方法。 需要注意的是,无论用那种方式实现了多线程,调用start方法并不意味着立即执行多线程代码,而是使得线程变为可运行状态。 run start的区别 start方法是启动一个线程,而线程中的run方法来完成实际的操作。 如果开发人员直接调用run方法,那么就会将这个方法当作一个普通函数来调用,并没有多开辟线程

muduo网络库的学习

寵の児 提交于 2020-03-07 03:10:36
muduo是由陈硕开发的一个Linux多线程网络库,采用了很多新的Linux特性,项目代码量不到5000行,性能也不错。 是难得的一个既能用来学习,也可以在实际生产环境中使用的网络库。地址 https://github.com/chenshuo/muduo 相关介绍可以见 https://www.cnblogs.com/CodeComposer/p/4719783.html 由于此网络库只支持Linux,不支持windows,导致使用起来有点麻烦。 1.建议下载 windows移植版进行学习,地址: https://github.com/kevin-gjm/muduo-win ,用vs跑起来,加上断点真正跑一跑,就很容易明白这里面几个类的相互关系。仅仅看源码对于初学者还是有点困难。 2.先搞几个小例子跑一跑,再试试增加点feature,比如服务器监听多个端口,实现SSL等等,在这些实践中能够更好地加深对此的理解 。 3.作者本人出的书《linux多线程服务端编程》可以说是介绍这个库的很好的资料。 来源: CSDN 作者: 阿龙哥哥 链接: https://blog.csdn.net/v6543210/article/details/104698172