Swift3.0 GCD多线程示例

2024-06-18 22:18
文章标签 多线程 示例 swift3.0 gcd

本文主要是介绍Swift3.0 GCD多线程示例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

///
func mainThread(){// 开一条全局队列异步执行任务DispatchQueue.global().async {/*  Group的用法*  1. notify(依赖任务), 必须和 enter/leave在同一队列才会执行*  2. wait(任务等待)*  3. enter/leave 手动管理group计数,enter和leave必须配对, 可以不需要wait()*/let group = DispatchGroup()var subTask: [DispatchQueue] = [DispatchQueue]()/* // 主线程DispatchQueue.main.async {  //通知ui刷新print("Main 刷新 UI: Begin")group.wait()Thread.sleep(forTimeInterval: 1)   //停止1秒print("Main 刷新 UI: End")}   // *///初始化8个子线程for i in 0...7{subTask.append(DispatchQueue(label: "subTask\(i)", attributes: .concurrent))}//启动8个子线程任务for item in subTask{group.enter()   //把该任务添加到组队列中执行, enter和leave必须配对item.async(group: group) {Thread.sleep(forTimeInterval: 1)   //停止1秒print("\(Date().description) subTask.label = \(item.label)")DispatchQueue.main.async(group: group, execute: refreshMainUI(dq: item))     // 通知主线程刷新UIgroup.leave()   //执行完之后从组队列中移除}group.notify(queue: item){ // 对应的子线程完成后,扫尾任务print("\(item.label) finished,do something more")// *** 此处可添加 对应的子线程完成后的扫尾任务sleep(10)}}}// 通知主线程刷新UI, 有需要在主线程中执行的代码,请添加到此func refreshMainUI(dq:DispatchQueue) -> DispatchWorkItem{let workItem = DispatchWorkItem {print("Refresh main UI: \(dq.label): Hello world! ")// *** 此处可添加 UI 刷新任务Thread.sleep(forTimeInterval: 5)   //停止1秒}return workItem}
}

Logs 如下:

 ****** Cyril Test Start ******2019-01-16 09:35:44 +0000 Main: Execute mainThread()****** Cyril Test End ******
Waitting all test done.
2019-01-16 09:35:44 +0000 subTask.label = subTask3
2019-01-16 09:35:44 +0000 subTask.label = subTask5
2019-01-16 09:35:44 +0000 subTask.label = subTask1
2019-01-16 09:35:44 +0000 subTask.label = subTask7
2019-01-16 09:35:44 +0000 subTask.label = subTask0
2019-01-16 09:35:44 +0000 subTask.label = subTask2
2019-01-16 09:35:44 +0000 subTask.label = subTask6
2019-01-16 09:35:44 +0000 subTask.label = subTask4
All test done.
Refresh main UI: subTask2: Hello world! 
Refresh main UI: subTask3: Hello world! 
Refresh main UI: subTask1: Hello world! 
Refresh main UI: subTask0: Hello world! 
subTask0 finished,do something more
subTask2 finished,do something more
subTask3 finished,do something more
subTask1 finished,do something more
subTask4 finished,do something more
Refresh main UI: subTask4: Hello world! 
subTask5 finished,do something more
subTask6 finished,do something more
subTask7 finished,do something more
Refresh main UI: subTask5: Hello world! 
Refresh main UI: subTask7: Hello world! 
Refresh main UI: subTask6: Hello world! 

最新代码放在gitlab上:

https://gitlab.com/cyril_j/mutils/blob/master/Swift/mainThread.swift

这篇关于Swift3.0 GCD多线程示例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1073212

相关文章

多线程解析报表

假如有这样一个需求,当我们需要解析一个Excel里多个sheet的数据时,可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。 Way1 join import java.time.LocalTime;public class Main {public static void main(String[] args) thro

zeroclipboard 粘贴板的应用示例, 兼容 Chrome、IE等多浏览器

zeroclipboard单个复制按钮和多个复制按钮的实现方法 最近网站改版想让复制代码功能在多个浏览器上都可以实现,最近看网上不少说我们的代码复制功能不好用的,我们最近将会增加代码高亮等功能,希望大家多多支持我们 zeroclipboard是一个跨浏览器的库类 它利用 Flash 进行复制,所以只要浏览器装有 Flash 就可以运行,而且比 IE 的

Java 多线程概述

多线程技术概述   1.线程与进程 进程:内存中运行的应用程序,每个进程都拥有一个独立的内存空间。线程:是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换、并发执行,一个进程最少有一个线程,线程实际数是在进程基础之上的进一步划分,一个进程启动之后,进程之中的若干执行路径又可以划分成若干个线程 2.线程的调度 分时调度:所有线程轮流使用CPU的使用权,平均分配时间抢占式调度

Java 多线程的基本方式

Java 多线程的基本方式 基础实现两种方式: 通过实现Callable 接口方式(可得到返回值):

基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例 3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例 4.基于SSM的高校实验室管理系统+LW参考示例 5.基于SpringBoot的二手数码回收系统+原生微信小程序+LW参考示例 6.基于SSM的民宿预订管理系统+LW参考示例 7.基于

Spring Roo 实站( 一 )部署安装 第一个示例程序

转自:http://blog.csdn.net/jun55xiu/article/details/9380213 一:安装 注:可以参与官网spring-roo: static.springsource.org/spring-roo/reference/html/intro.html#intro-exploring-sampleROO_OPTS http://stati

JAVA- 多线程

一,多线程的概念 1.并行与并发 并行:多个任务在同一时刻在cpu 上同时执行并发:多个任务在同一时刻在cpu 上交替执行 2.进程与线程 进程:就是操作系统中正在运行的一个应用程序。所以进程也就是“正在进行的程序”。(Windows系统中,我们可以在任务管理器中看 到进程) 线程:是程序运行的基本执行单元。当操作系统执行一个程序时, 会在系统中建立一个进程,该进程必须至少建立一个线

Java http请求示例

使用HttpURLConnection public static String httpGet(String host) {HttpURLConnection connection = null;try {URL url = new URL(host);connection = (HttpURLConnection) url.openConnection();connection.setReq

多线程篇(阻塞队列- LinkedBlockingDeque)(持续更新迭代)

目录 一、LinkedBlockingDeque是什么 二、核心属性详解 三、核心方法详解 addFirst(E e) offerFirst(E e) putFirst(E e) removeFirst() pollFirst() takeFirst() 其他 四、总结 一、LinkedBlockingDeque是什么 首先queue是一种数据结构,一个集合中

2.3多任务编程示例1

1.CUBEMAX配置  2.CODE void StartTask1(void const * argument){/* USER CODE BEGIN StartTask1 */TickType_t pxPreviousWakeTime=xTaskGetTickCount();/* Infinite loop */for(;;){LED1_Turn();// vTaskDelay