【问题标题】:Understanding Threads Swift理解线程 Swift
【发布时间】:2016-02-02 09:30:44
【问题描述】:

我有点理解线程,如果我错了,请纠正我。

  • 在一段代码完成之前,是否将单个线程分配给一段代码?
  • 线程是否优先处理首先运行的代码?
  • 主队列和线程有什么区别?

我最重要的问题:

线程可以同时运行吗?如果是这样,我如何指定我的代码的哪些部分应该在选定的线程上运行?

【问题讨论】:

标签: multithreading swift


【解决方案1】:

让我从这里开始。除非您正在编写一种特殊类型的应用程序(如果您是的话,您会知道的),请忘记线程。使用线程是复杂而棘手的。使用调度队列......它更简单更容易。

调度队列运行任务。任务是闭包(块)或函数。当您需要从主调度队列运行任务时,您调用dispatch_ 函数之一,主要的函数是dispatch_async()。当您调用dispatch_async() 时,您需要指定在哪个队列上运行任务。要获得队列,您可以调用dispatch_queue_create()dispatch_get_ 之一,主要的是dispatch_get_global_queue


注意:Swift 3 将其从函数模型更改为对象模型。 dispatch_ 函数是DispatchQueue 的实例方法。 dispatch_get_ 函数转换为DispatchQueue 的类方法/属性


// Swift 3
DispatchQueue.global(qos: .background).async {
    var calculation = arc4random()
}

// Swift 2
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
    var calculation = arc4random()
}

这里的麻烦是所有更新 UI 的任务必须在主线程上运行。这通常通过在主队列 (dispatch_get_main_queue()) 上调用 dispatch_async() 来完成。

// Swift 3
DispatchQueue.global(qos: .background).async {
    var calculation = arc4random()

    DispatchQueue.main.async {
        print("\(calculation)")
    }
}

// Swift 2
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) {
    var calculation = arc4random()

    dispatch_async(dispatch_get_main_queue()) {
        print("\(calculation)")
    }
}

血淋淋的细节很混乱。为了简单起见,调度队列管理线程池。由调度队列来创建、运行和最终处理线程。主队列是一个特殊队列,只有一个线程。操作系统的任务是将线程分配给处理器并执行在线程上运行的任务。


说了这么多,现在我来回答你的问题。

  • 在一段代码完成之前,是否将单个线程分配给一段代码?

任务将在单个线程中运行。

  • 线程是否优先处理首先运行的代码?

任务被分配给一个线程。任务不会改变它在哪个线程上运行。如果一个任务需要在另一个线程中运行,那么它会创建一个新任务并将该新任务分配给另一个线程。

  • 主队列和线程有什么区别?

主队列是一个有 1 个线程的调度队列。这个单线程也称为主线程。

  • 线程可以同时运行吗?

线程由操作系统分配在处理器上执行。如果您的设备有多个处理器(它们现在都是),那么多个线程会同时执行。

  • 如果是这样,我如何指定代码的哪些部分应在选定线程上运行?

将代码分解为任务。在调度队列中调度任务。

【讨论】:

  • 非常感谢,这是任何人给我的最好帮助。
猜你喜欢
  • 2021-10-01
  • 2017-11-19
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 2023-03-22
  • 1970-01-01
  • 2021-02-26
相关资源
最近更新 更多