一 说明

本文涉及代码可以从https://github.com/HanGangAndHanMeimei/Code地址获得。

二 NSThread的基本使用和创建

  1)基本用法(主线程|当前线程)

 1        //1.获得执行该方法的当前线程
2 let currentThread = NSThread.currentThread()
3 print("当前线程为\(currentThread)")
4
5 //2.获得应用程序的主线程
6 let mainThread = NSThread.mainThread()
7 print("应用程序的主线程\(mainThread)")
8
9 //3.判断当前线程是否是主线程
10 let isMain = NSThread.isMainThread() 2)创建线程   说明:此处列出创建线程的四种方法:分别是   直接创建|分离出一条子线程|创建一条后台线程|自定义线程类继承自NSThread重写内部的main方法封装任务,然后init创建。 1 //NSThread创建线程的四种方式
2 func createNewThreadWithNSThreadMethodOne()
3 {
4 //1.创建线程
5 let thread = NSThread.init(target: self, selector:Selector("run"), object: nil)
6
7 //设置线程的名称
8 thread.name = "线程A"
9
10 //2.启动线程
11 thread.start()
12 }
13
14 func createNewThreadWithNSThreadMethodTwo()
15 {
16 //分离出一条子线程,自动启动线程,但无法获得线程对象
17 NSThread.detachNewThreadSelector(Selector("run"), toTarget: self, withObject: nil)
18 }
19
20 func createNewThreadWithNSThreadMethodThree()
21 {
22 //开启一条后台线程,自动启动线程,但无法获得线程对象
23 self.performSelectorInBackground(Selector("run"), withObject: nil);
24 }
25
26 func createNewThreadWithNSThreadMethodFour()
27 {
28 //let thread = CustomThread.init(target: self, selector:Selector("run"), object: nil)
29 let thread = CustomThread();
30 thread.start()
31 }
32
33 func run()
34 {
35 //获得当前执行run方法的线程
36 let thread = NSThread.currentThread()
37 print("run--\(thread.name)-\(thread)");
38 } 三 NSThread线程的状态和线程安全   1)线程的状态     线程的状态:新建-就绪-运行-阻塞-死亡 1 //线程的退出
2 NSThread.exit()
3 //线程的休眠1
4 NSThread.sleepForTimeInterval(2.0)
5 //线程的休眠2
6 NSThread.sleepUntilDate(NSDate.init(timeIntervalSinceNow: 3.0))   2)线程安全     说明:多线程访问同一个资源的时候可能会出现数据错乱等安全问题,解决方法是对必要的代码段进行加锁。     注意:在OC中加互斥锁使用@synchronized(self) {},在Swift可以使用objc_sync_enter(self)和objc_sync_exit(self)方法,注意这两个方法必须成对使用,把要加锁的代码放在中间 1 class ViewController: UIViewController {
2
3 //设置总票数为100张
4 var totalTickets = 100
5
6 override func viewDidLoad() {
7 super.viewDidLoad()
8
9 //多线程访问资源加锁
10 //创建三条线程分别代表售票员A、售票员B、售票员C
11 let thread01 = NSThread.init(target: self, selector:Selector("saleTickect"), object: nil)
12 let thread02 = NSThread.init(target: self, selector: Selector("saleTickect"), object: nil);
13 let thread03 = NSThread.init(target: self, selector: Selector("saleTickect"), object: nil);
14
15 //设置线程的名称
16 thread01.name = "售票员A"
17 thread02.name = "售票员B"
18 thread03.name = "售票员C"
19
20 //开启线程
21 thread01.start()
22 thread02.start()
23 thread03.start()
24
25 }
26
27 //模拟售票的函数
28 func saleTickect()
29 {
30 while(true)
31 {
32 //加互斥锁
33 /*
34 * 1)同OC中的@synchronized(self) {}
35 * 2)objc_sync_enter(self)和objc_sync_exit(self)必须成对使用,把要加锁的代码放在中间
36 */
37
38 objc_sync_enter(self)
39
40 //检查是否有余票,如果有则卖出去一张
41 let temp = totalTickets
42 for var i=0;i<100000;i++
43 {
44 //空的for循环,模拟延迟
45 }
46
47 if(temp>0)
48 {
49 totalTickets = temp - 1
50 print("\(NSThread.currentThread().name)卖出去了一张票,还剩\(totalTickets)")
51 }else
52 {
53 print("\(NSThread.currentThread().name)发现票已经卖完了")
54 break;
55 }
56
57 objc_sync_exit(self)
58 }
59
60 }
61
62 } 三 NSThread线程间通信   1)说明     所谓线程间通信,即如何从一个线程进入到另一个线程继续执行任务或者是传递参数(如从子线程回到主线程)     下面的代码示例演示在主线程中先创建一个子线程下载图片,当图片下载完成后又切换到主线程设置图片的操作。 1 //!!!注意,该案例内部下载图片,发送了http请求需要修改info.plist文件
2 class ViewController: UIViewController {
3
4 @IBOutlet weak var imageView: UIImageView!
5
6 override func viewDidLoad() {
7 super.viewDidLoad()
8
9 //程序启动后开子线程下载图片,图片下载完成之后回到主线程设置图片
10 NSThread.detachNewThreadSelector(Selector("downloadImage"), toTarget: self, withObject: nil)
11 }
12
13 func downloadImage()
14 {
15 //1.获得要下载图片的url
16 let url = NSURL.init(string: "http://p9.qhimg.com/t014d1bd470cb60ac6e.jpg")
17
18 //2.把url地址指向资源的二进制下载到本地
19 let imageData = NSData.init(contentsOfURL: url!)
20
21 //3.把二进制数据转换为图片
22 let image = UIImage.init(data: imageData!);
23
24 //4.打印查看当前线程(应该是在子线程中下载图片)
25 print("当前线程为\(NSThread.currentThread())")
26
27 //5.线程间通信
28 //方法一
29 self.performSelectorOnMainThread(Selector("showImage:"), withObject: image, waitUntilDone:true)
30 //方法二
31 //imageView.performSelectorOnMainThread(Selector("setImage:"), withObject: image, waitUntilDone:true)
32 }
33
34
35 func showImage(image:UIImage)
36 {
37 //设置图片
38 imageView.image = image
39
40 //打印查看设置图片操作的线程
41 print("处理UI刷新操作的线程\(NSThread.currentThread())")
42
43 }
44 }

swift开发多线程篇 - NSThread 线程相关简单说明(一些使用和注意点)的更多相关文章

  1. iOS开发Swift篇(02) NSThread线程相关简单说明

    iOS开发Swift篇(02) NSThread线程相关简单说明 一 说明 1)关于多线程部分的理论知识和OC实现,在之前的博文中已经写明,所以这里不再说明. 2)该文仅仅简单讲解NSThread在s ...

  2. 李洪强iOS开发Swift篇---12_NSThread线程相关简单说明

    李洪强iOS开发Swift篇---12_NSThread线程相关简单说明 一 说明 1)关于多线程部分的理论知识和OC实现,在之前的博文中已经写明,所以这里不再说明. 2)该文仅仅简单讲解NSThre ...

  3. swift开发多线程篇 - 多线程基础

    swift开发多线程篇 - 多线程基础 iOS 的三种多线程技术 (1)NSThread  使用NSThread对象建立一个线程非常方便 但是!要使用NSThread管理多个线程非常困难,不推荐使用 ...

  4. iOS开发多线程篇—创建线程

    iOS开发多线程篇—创建线程 一.创建和启动线程简单说明 一个NSThread对象就代表一条线程 创建.启动线程 (1) NSThread *thread = [[NSThread alloc] in ...

  5. iOS开发多线程篇 04 —线程间的通信

    iOS开发多线程篇—线程间的通信 一.简单说明 线程间通信:在1个进程中,线程往往不是孤立存在的,多个线程之间需要经常进行通信 线程间通信的体现 1个线程传递数据给另1个线程 在1个线程中执行完特定任 ...

  6. iOS开发多线程篇 03 —线程安全

    iOS开发多线程篇—线程安全 一.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块 ...

  7. iOS开发——多线程篇——NSThread

    一.基本使用1.创建和启动线程一个NSThread对象就代表一条线程 创建.启动线程NSThread *thread = [[NSThread alloc] initWithTarget:self s ...

  8. iOS开发多线程篇—多线程简单介绍

    iOS开发多线程篇—多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcod ...

  9. iOS开发多线程篇—线程安全

    iOS开发多线程篇—线程安全 一.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块 ...

随机推荐

  1. [C/C++标准库]_[0基础]_[使用fstream合并文本文件]

    场景: 1. 就是合并文本文件,而且从第2个文件起不要合并第一行. 2. 多加了一个功能,就是支持2个以上的文件合并. 3. 问题: http://ask.csdn.net/questions/192 ...

  2. 关于命令行签名时.SF和.RSA文件的命名问题

    准备工作: 签名文件名称为android.keystore 签名的别名为123456789.keystore 1.使用签名命令后例如以下图 发现.SF和.RSA文件自己主动命名为12345678.SF ...

  3. Android学习笔记进阶18 之画图并保存图片到本地

    1.首先创建一个Bitmap图片,并指定大小:   2.在该图片上创建一个新的画布Canvas,然后在画布上绘制,并保存即可:   3.需要保存的目录File,注意如果写的目录如“/sdcard/so ...

  4. php中array_merge函数

    php中array_merge函数 一.array_merge简介 (PHP 4, PHP 5, PHP 7) array_merge — 合并一个或多个数组 说明¶ array array_merg ...

  5. wget 指令学习之递归抓取文档技巧

    在线上阅读文档的时候,有没有想将它抓取到本地,以备没有网的时候阅读只需? 先上指令: $ wget --user-agent="Mozilla/5.0 (X11; Linux x86_64) ...

  6. C++异常实现与longjmp, setjmp,栈指针EBP, Active Record

    这篇讲的不错: http://blog.csdn.net/smstong/article/details/50728022 首先Active Record 然后EBP,ESP等指针 2 通过setjm ...

  7. [AngularFire] Resolve snapshotChanges doesn't emit value when data is empty

    Updated to AngularFire2 v5.0. One important change is that you need to call .snapshotChanges() or .v ...

  8. Exclusive or

    题目连接 题意: 每次给一个n.求 (2≤n<10500) 分析: 先说一下自己的想法,假设将n换成二进制数,也就一两千位左右,那么一位一位处理是能够接受的. 将0-n写成二进制形式后,显然全部 ...

  9. 将字符串使用md5加密

    >>> import md5 >>> md5.md5('123').hexdigest() '202cb962ac59075b964b07152d234b70' & ...

  10. LeetCode OJ Basic Calculator II

    Basic Calculator II 题目 思路 和这个一样:Basic Calculator I 代码 class ExpressionTransformation { public: strin ...