漫谈多线程(二)

一.多线程实现方案

1>pthread

  1)语言:C语言

  2)特点: (1)通用的多线程API

      (2)适用于Unix\Linux\Windows等

      (3)跨平台\可移植

      (4)使用难度大

  3)生命周期:程序员管理 

示例:

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //1.创建一个pthread对象
    pthread_t thread;

    //2.创建线程
    /*
     第一个参数:线程对象,需要传地址
     第二个参数:线程的一些属性,可以传NULL
     第三个参数:该线程创建后要调用的方法,注意这里是一个指向函数的指针
     第四个参数:第三个参数(函数指针)中接收的参数,如果没有那么传NULL
     */
    pthread_create(&thread, NULL, run, NULL);

    pthread_t thread2;
    pthread_t thread3;
    pthread_create(&thread2, NULL, run, NULL);
    pthread_create(&thread3, NULL, run, NULL);
}

void *run(void * param)
{
    NSLog(@"--run--%@",[NSThread currentThread]);
    return NULL;
}

 

2>NSThread

  1)语言:OC语言

  2)特点: (1)可以对线程状态操作,简单易用

      (2)使用更加面向对象

  3)生命周期:程序员管理

注意的地方:

1)创建线程的四种方法 alloc initwith..|detachNewThread|performSelectorInBack..|自定义

2)设置线程的属性(名称&优先级[0.0~1.0])

3)NSThread创建线程的生命周期:当任务执行完毕的时候被释放

3>GCD(任务+队列)

  1)语言:C语言

  2)特点: (1)能够充分利用设备多核,并且是自动的

      (2)旨在替代NSThread等线程技术

  3)生命周期:自动管理

注意的地方:

1)全局并发队列,是系统自带的队列,需要的时候调用即可,一共有四种,它们的优先级是默认存在的.苹果官方文档指出,栅栏函数对它们无效.

2)主队列,凡是添加到主队列中的任务都是在主线程中执行的.

3)使用步骤:封装任务-->把任务丢给队列,系统会按照FIFO原则把任务给对应的线程处理

4)同步函数+串行队列 -->不会开线程,所有的任务串行执行

同步函数+并发队列 -->不会开线程,所有的任务串行执行

同步函数+主队列 -->死锁(因为主队列调度任务时会先检查主线程状态,如果主线程发现忙着会暂停调度,所以这种情况会死锁)

异步函数+串行队列 -->会开一条线程,所有的任务串行执行

异步函数+并发队列 -->会开多条线程,所有的任务并发执行

异步函数+主队列 -->不会开线程,所有的任务串行执行

5)iOS6.0之前,creat一次就release一次.iOS6.0之后纳入ARC管理

6)其他常用函数

  ①栅栏函数-->用来控制任务的执行顺序,但是不能用全局并发队列(苹果官方文档是这样说明的)

  ②一次性函数-->整个程序运行中,一次性代码只执行一次,可以用来实现单例模式(注意,不能放到懒加载中)

  ③延迟执行

  ④快速迭代(注意不能使用主队列)

  ⑤队列组的使用

4>NSOpreation(操作+队列)

  1)语言:OC语言

  2)特点: (1)它的底层是基于GCD,比GCD多了一些简单实用功能

      (2)使用更加面向对象

  3)生命周期:自动管理

注意的地方:

1)NSOperation用来封装操作,NSOpreationQueue用来存放任务

2)实现步骤:封装操作--->把操作添加到队列

3)对于NSBlockOperation,可以追加任务,如果一个操作中有多个任务,那么会开子线程,但不一定在子线程中处理

4)自定义NSOpreation --->重写内部的Main方法,有利于代码的封装和复用

5)非主队列同时具备串行和并发功能,默认是并发队列,通过控制最大并发数来实现

6)把操作添加到队列中的方法内部会自动调用start方法

7)队列的挂起:YES-->暂停  , NO-->继续;(挂起只能挂起当前非处于执行状态的任务)

8)队列的取消:取消不可恢复;(苹果官方建议,如果是自定义的NSOpreation,每执行完一段耗时操作,就检查当前操作是否取消)

9)操作的依赖和监听:可以跨队列依赖,注意不要循环依赖就好了

                                                                2016-5-22   奈文摩尔

     

时间: 2024-10-25 19:43:16

漫谈多线程(二)的相关文章

多线程二(GCD)代码笔记

// // TWFXViewController.h // Demo_GCD // // Created by Lion User on 12-12-11. // Copyright (c) 2012年 Lion User. All rights reserved. // #import <UIKit/UIKit.h> @interface TWFXViewController : UIViewController @property (retain, nonatomic) IBOutlet

python多线程(二)

原文:http://blog.sina.com.cn/s/blog_4b5039210100esc1.html 基础不必多讲,还是直接进入python. Python代码代码的执行由python虚拟机(也叫解释器主循环)来控制.Python在设计之初就考虑到要在主循环中,同时只有一个线程在执行,就像单CPU的系统中运行多个进程那样,内存中可以存放多个程序,但任意时候,只有一个程序在CPU中运行.同样,虽然python解释器可以“运行”多个线程,但在任意时刻,只有一个线程在解释器中运行. 对pyt

【黑马】程序员————多线程(二)单例设计模式、线程间通信,JDK1.5互斥锁

------Java培训.Android培训.iOS培训..Net培训.期待与您交流!----- 一.单例设计模式 单例设计模式的意义: A.保证类在内存中只有一个对象,不提供外部访问方式,构造函数用private修饰. B.提供公共方法(static修饰,类的静态方法),获取类的实例.单例设计模式分为饿汉和懒汉两种模式. 饿汉式&懒汉式 class Test33 { public static void main(String[] args) { Fanjianan.getInstance()

Java:多线程&lt;二&gt; 同步

由于多线程的访问出现延迟和线程的随机性,在使用多线程时往往会伴随安全性的问题,这些问题一旦出现将会是非常严重的.为了解决这种安全性问题,synchronized出现了. synchronized用法一,放在方法内,必须传一个对象obj synchronized(obj) { //需要被同步的代码 } synchronized用法二,放在方法上,不需要传对象 public synchronized void method() { //该方法体中所有的代码都被同步了 } 例子:银行有个小金库,初始为

漫谈多线程(一)

一.多线程这里的东西个人觉得整体的设计灵感来自于生活,多线程的目的是为了提高程序运行的效率,映射到我们生活中,是能找到异曲同工之妙的. 二.多线程提的比较的多的概念可能就是同步和异步了,什么是同步,简单说就是前面的任务没完成的话不执行后面的任务,异步就是前面的任务就算没执行完,后面的任务也开始执行.比如生活中,我们下班回家了,需要做饭,洗衣服,拖地.同步的方式就是一.先用电饭锅开始煮饭,花了10分钟,我们看着电饭锅把饭煮熟,二.然后再去用洗衣机洗衣服,花了10分钟,看着洗衣机把衣服洗完,三.再来

java多线程(二)——用到的设计模式

接上篇:java多线程(一)http://www.cnblogs.com/ChaosJu/p/4528895.html java实现多线程的方式二,实现Runable接口用到设计模式——静态代理模式 一.代理模式 代理模式的定义 代理模式(Proxy Pattern)是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并由代理对象控制对原对象的引用. 代理模式不会改变原来的接口和行为,只是转由代理干某件事,代理可以控制原来的目标,例如:代理商,代理商只会卖东西,但并不会改变行为,不会制造

C# 多线程(二) 线程同步基础(上)

本系列的第一篇简单介绍了线程的概念以及对线程的一些简单的操作,从这一篇开始讲解线程同步,线程同步是多线程技术的难点.线程同步基础由以下几个部分内容组成 1.同步要领(Synchronization Essentials) 2.锁(Locking) 3.线程安全(Thread Safety) 4.事件等待句柄(Signaling with Event Wait Handles) 5.同步上下文(Synchronization Contexts) 同步要领(Synchronization Essen

java之多线程二

一.JDK5之后的Lock锁的概述和使用 package a; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class SellTicket implements Runnable { //定义票 private int tickets = 100; //定义锁对象 private Lock lock = new ReentrantLock(); @

多线程(二) 线程的安全隐患

有了多线程就有了资源竞争,当多个线程对同一资源进行操作时就容易出现安全隐患. 下面举一个卖票的例子来说明线程的安全隐患 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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 @interface ViewController () @property (assign, nonatomic)NSInteger ticke