ios简单多线程

多线程

卖票 与 多线程同步

创建并启动线程

        let thread1 = Thread(target: self, selector: #selector(thread1Action), object: nil) // 创建一个线程对象
        thread1.start() // 启动线程
   

方法2 创建并启动线程

	Thread.detachNewThreadSelector(#selector(thread2Action), toTarget: self, with: nil)

多线程同步,及其的意义

  // 为了线程同步 ,定义一些线程锁
    var threadLock :NSLock!// 定义进程锁

线程锁

threadLock.lock() //上锁
//...
//线程工作内容
threadLock.unlock() //解锁

同步 例子

import UIKit

class ViewController: UIViewController {
  
  var idTicket: Int = 200000     // 模拟票的总数,每张票的ID
  var salerTicketCnt: Int!      // 每个站点售票数量
  var threadLock: NSLock!       // 线程锁
  
  override func viewDidLoad() {
    super.viewDidLoad()
    
    salerTicketCnt = idTicket / 2       // 每个站点售票数量
    threadLock = NSLock()               // 构造线程锁对象
    
    // layout
    let btn1 = UIButton(frame: CGRect(x: 20, y: 100, width: self.view.bounds.size.width - 40, height: 30))
    btn1.addTarget(self, action: #selector(btn1Action), for: .touchDown)
    btn1.setTitle("站点1开始售票", for: .normal)
    btn1.layer.backgroundColor = UIColor.lightGray.cgColor
    btn1.setTitleColor(UIColor.black, for: .normal)
    self.view.addSubview(btn1)
    
    let btn2 = UIButton(frame: CGRect(x: 20, y: 200, width: self.view.bounds.size.width - 40, height:30))
    btn2.addTarget(self, action: #selector(btn2Action), for: .touchDown)
    btn2.setTitle("站点2开始售票", for: .normal)
    btn2.layer.backgroundColor = UIColor.lightGray.cgColor
    btn2.setTitleColor(UIColor.black, for: .normal)
    self.view.addSubview(btn2)
  }

  @objc func btn1Action() {
    let thread1 = Thread(target: self, selector: #selector(thread1Action), object: nil)     // 创建进行
    thread1.start()   // 启动进行
  }
  
  @objc func btn2Action() {
    Thread.detachNewThreadSelector(#selector(thread2Action), toTarget: self, with: nil)     // 创建并启动线程
  }
  
  @objc func thread1Action() {    // 线程1目标方法
    for _ in 0..<salerTicketCnt {
      print("站点1:\(idTicket)")    // 模拟售票
      threadLock.lock()             // 线程锁定
      idTicket -= 1                 // 模拟售票,ID自减
      threadLock.unlock()           // 线程解锁
    }
  }
  
  @objc func thread2Action() {    // 线程2目标方法
    for _ in 0..<salerTicketCnt {
      print("站点2:\(idTicket)")    // 模拟售票
      threadLock.lock()             // 线程锁定
      idTicket -= 1                 // 模拟售票,ID自减
      threadLock.unlock()           // 线程解锁
    }
  }
}


UI

在这里插入图片描述
console 情况

GCD

Grand Central Dispatch(GCD) 是 Apple 开发的一个多核编程的较新的解决方法。它主要用于优化应用程序以支持多核处理器以及其他对称多处理系统。它是一个在线程池模式的基础上执行的并发任务。在 Mac OS X 10.6 雪豹中首次推出,也可在 iOS 4 及以上版本使用。
[百度百科]

  • 使用时候不需要考虑线程池出入。
  • 不需要思考线程管理,而只用care让线程干什么,GCD 会自动管理线程的生命周期(创建销毁线 程,调度任务)
  • 自动使用多核并行。

先看一个异步的简单例子:

例子:MultiThreadTimer

//
//  ViewController.swift
//  MultiThreadDispatch
//
//  Created XS on 2018/12/12.
//

import UIKit

class ViewController: UIViewController {
  
  @IBOutlet weak var labelCount01: UILabel!
  @IBOutlet weak var labelCount02: UILabel!
  
  var isStop = false              // 计时停止标记
  
  @IBAction func btnStart01(_ sender: UIButton) {
    isStop = false
    
    let golbalQueue = DispatchQueue.global()    // 获取GCD全局异步队列
    golbalQueue.async {                         // 调用async方法,创建异步任务
      for i in 1...10000 {
        if (self.isStop) {
          break
        }
        Thread.sleep(forTimeInterval: 0.001)        // 线程休眠
        // 主线程异步执行(主线程同步可能会死锁)
        DispatchQueue.main.async(execute: {       // 获取主线程队列,调用async方法
          self.labelCount01.text = "\(i) ms"
        })
      }
    }
  }
  
  @IBAction func btnStart02(_ sender: UIButton) {
    isStop = false
    DispatchQueue.global().async {
      for i in 1...100000 {
        if (self.isStop) {
          break
        }
        Thread.sleep(forTimeInterval: 0.001)
        DispatchQueue.main.async(execute: {
          self.labelCount02.text = "\(i) ms"
        })
      }
    }
  }
  
  @IBAction func btnStop(_ sender: UIButton) {
    isStop = true
  }
}

ui

let golbalQueue = DispatchQueue.global()    // 全局的GCD 的移步队列

// 创建异步任务
golbalQueue.async {  
//	job...
}
内容概要:本文介绍了基于改进Retinex算法的视频图像增强技术研究,并提供了相应的Matlab代码实现。Retinex理论源于人类视觉系统对光照变化的适应性,通过分离图像的照度与反射分量,有效提升图像的亮度、对比度和色彩保真度。文中所提出的改进算法旨在克服传统Retinex方法中存在的光晕伪影、噪声放大和计算复杂等问题,可能引入了如多尺度分解、颜色校正或自适应滤波等优化策略,从而实现更自然、清晰的图像增强效果。该研究特别适用于低光照、雾霾、水下拍摄等恶劣成像条件下的视频与图像处理,提升后续视觉分析的准确性。; 适合人群:具备一定图像处理基础和Matlab编程经验的科研人员、研究生及工程技术人员,尤其是从事计算机视觉、视频监控、遥感影像、医学影像或无人机视觉导航等领域研究的专业人士。; 使用场景及目标:① 解决实际应用中因光照不足或环境干扰导致的图像质量下降问题;② 学习和掌握Retinex算法的核心思想及其改进方法;③ 获取可直接运行和调试的Matlab代码,作为相关课题研究或项目开发的技术参考。; 阅读建议:此资源以Matlab代码实现为核心,建议读者在阅读时结合代码逐行分析,理解算法的每一步实现细节。同时,应尝试使用不同的测试图像进行实验,调整算法参数,观察增强效果的变化,从而深入理解算法的性能特点和优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值