分类 ios多线程 下的文章

swift线程间通讯

//
//  ViewController.swift
//  多线程
//
//  Created by admin on 16/2/17.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    var ticketsNumber = 20
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.performSelectorInBackground("getImage", withObject: nil)
    }
    func getImage()
    {
        // oc子线程里面的runloop默认不开启, 也就意味不会自动创建自动释放池, 子线程里面autorelease的对象 就会没有池子可放。 也就意味后面没办法进行释放。 造成内存泄露
        // 所以需要手动创建,好像不是的
        print(NSThread.currentThread())
        let data = NSData(contentsOfURL: NSURL(string: "http://f.hiphotos.baidu.com/image/pic/item/7aec54e736d12f2eec17b2b54bc2d562843568d0.jpg")!)
        // 更新ui要在主线程,所以这里把获取到的图片去主线程赋值
        //self.performSelectorOnMainThread(Selector("assignImage:"), withObject: UIImage(data: data!), waitUntilDone: false)
//        self.performSelector(Selector("assignImage:"), onThread: NSThread.mainThread(), withObject: UIImage(data: data!), waitUntilDone: false, modes: [NSRunLoopCommonModes])
        self.performSelector(Selector("assignImage:"), onThread: NSThread.mainThread(), withObject: UIImage(data: data!), waitUntilDone: false)

    }
    class Jin {
        deinit
        {
            print("对象销毁啦。。。")
        }
    }
    func assignImage(image:UIImage)
    {
        print(NSThread.currentThread())
        self.imageView.image = image
    }
}

ios互斥锁

//
//  ViewController.swift
//  多线程
//
//  Created by admin on 16/2/17.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController {
    var ticketsNumber = 20
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        let threadA = NSThread(target: self, selector: "buyTicket", object: nil)
        threadA.name = "售票员A"
        threadA.start()
        let threadB = NSThread(target: self, selector: "buyTicket", object: nil)
        threadB.name = "售票员B"
        threadB.start()
    }
    // 模拟卖票
    func buyTicket()
    {
        /**
        注意点:
        1.锁定的代码尽量少
        2.加锁范围内的代码同一时间只允许一个程序执行
        3.继承自NSObject的类都可以作为互斥锁的参数
        4.要保证所有的线程访问到这个锁,并且所有的线程访问的都是同一个锁对象
        */
        while(self.ticketsNumber > 0)
        {
            sleep(1)
            // 锁
            objc_sync_enter(self)
            print(NSThread.currentThread().name! + "卖出了\(self.ticketsNumber)号票")
            self.ticketsNumber--
            // 解锁
            objc_sync_exit(self)
        }
    }
}

NSThread使用以及基本属性

//
//  ViewController.swift
//  多线程
//
//  Created by admin on 16/2/17.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.threadStatus()
    }
    // 线程状态
    func threadStatus()
    {
        // 线程的状态有:就绪,运行,死亡,阻塞
        let thread = NSThread(target: self, selector: Selector("threadStatusRun:"), object: nil)

        // 放到可调度的线程池,等到被调度,就绪状态
        thread.start()
    }
    // 线程状态测试方法
    func threadStatusRun(parameter:AnyObject? = nil)
    {
        // 进入阻塞状态
        // 阻塞指定的时间
        //NSThread.sleepForTimeInterval(5)
        // 阻塞到指定的日期
        //NSThread.sleepUntilDate(NSDate(timeIntervalSinceNow: 5))
        // 退出,进入死亡状态
        NSThread.exit()
        print(parameter)
        for(var i = 1;i < 10000;i++)
        {
            // 打印当前线程  <NSThread: 0x7fd6ab50f480>{number = 2, name = (null)}
            print(NSThread.currentThread())
        }
    }
    // 线程属性
    func threadAttr()
    {
        let thread = NSThread(target: self, selector: Selector("run:"), object: "jin")
        // 优先级,一般不需要设置
        thread.threadPriority = 0.1
        // 名字
        thread.name = "jin"
        thread.start()
    }
    // 创建子进程的方式A和b比较方便(隐式创建),但是不能设置线程的详细的属性
    func createThreadA()
    {
        NSThread.detachNewThreadSelector(Selector("run:"), toTarget: self, withObject: nil)
    }
    func createThreadB()
    {
        self.performSelectorInBackground(Selector("run:"), withObject: nil)
    }
    // 可以设置线程的属性
    func createThreadC()
    {
        let thread = NSThread(target: self, selector: Selector("run:"), object: nil)
        thread.start()
    }
    // 测试方法
    func run(parameter:AnyObject? = nil)
    {
        print(parameter)
        for(var i = 1;i < 10000;i++)
        {
            // 打印当前线程  <NSThread: 0x7fd6ab50f480>{number = 2, name = (null)}
            print(NSThread.currentThread())
        }
    }
}

swift使用pthread

//
//  ViewController.swift
//  多线程
//
//  Created by admin on 16/2/17.
//  Copyright © 2016年 jin. All rights reserved.
//

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        // 在当前线程中执行循环,在循环结束之前,界面会卡住
//        self.long()
        // 在子进程中执行循环,界面不会卡住
//        self.performSelectorInBackground("long", withObject: nil)
        self.start()
    }

    func start()
    {
        // 初始化需要的属性
        var pthread = pthread_t()
        var pthreadAttr = pthread_attr_t()
        var returnValue = pthread_attr_init(&pthreadAttr)
        returnValue = pthread_attr_set_qos_class_np(&pthreadAttr, QOS_CLASS_USER_INTERACTIVE, 0)
        // 线程执行的函数
        func run(x:UnsafeMutablePointer<Void>)->UnsafeMutablePointer<Void>
        {
            for(var i = 1;i < 10000;i++)
            {
                // 打印当前线程  <NSThread: 0x7fd6ab50f480>{number = 2, name = (null)}
                print(NSThread.currentThread())
                print(i)
            }
            return nil
        }
        // 闭包
//        pthread_create(&pthread, &pthreadAttr, { (x:UnsafeMutablePointer<Void>) in
//            for(var i = 1;i < 10000;i++)
//            {
//                // 打印当前线程  <NSThread: 0x7fd6ab50f480>{number = 2, name = (null)}
//                print(NSThread.currentThread())
//                print(i)
//            }
//            return nil
//        }, nil)
        /**
        (要开的线程变量,线程的属性,线程执行的函数,需要传递的参数)
        */
        // pthread_create(<#T##UnsafeMutablePointer<pthread_t>#>, <#T##UnsafePointer<pthread_attr_t>#>, <#T##((UnsafeMutablePointer<Void>) -> UnsafeMutablePointer<Void>)!##((UnsafeMutablePointer<Void>) -> UnsafeMutablePointer<Void>)!##(UnsafeMutablePointer<Void>) -> UnsafeMutablePointer<Void>#>, <#T##UnsafeMutablePointer<Void>#>)

        // 函数,用self.run就报错。。。。
        pthread_create(&pthread, &pthreadAttr, run, nil)
    }

    func run(x:UnsafeMutablePointer<Void>)->UnsafeMutablePointer<Void>
    {
        for(var i = 1;i < 10000;i++)
        {
            // 打印当前线程  <NSThread: 0x7fd6ab50f480>{number = 2, name = (null)}
            print(NSThread.currentThread())
            print(i)
        }
        return nil
    }
    func long()
    {
        for(var i = 1;i < 100000;i++)
        {
            // 打印当前线程  <NSThread: 0x7fd6ab50f480>{number = 2, name = (null)}
            print(NSThread.currentThread())
            print(i)
        }
    }
}