您可以使用线程迁移技术
然后是一个有趣的任务,叫做GCD-Grand Central Dispatch
Grand Central Dispatch (GCD) 是 Apple Inc. 开发的一项技术,用于优化对具有多核处理器的系统和其他对称多处理系统的应用程序支持。它是基于线程池模式的任务并行实现。
GCD 的工作原理是允许程序中可以并行运行的特定任务排队等待执行,并根据处理资源的可用性,安排它们在任何可用的处理器内核上执行
调度队列是维护任务队列的对象,可以是匿名代码块或函数,并轮流执行这些任务。该库自动创建多个具有不同优先级的队列,这些队列同时执行多个任务,并根据操作环境选择要运行的最佳任务数量。库的客户端也可以创建任意数量的串行队列,它们按照提交的顺序执行任务,一次一个。因为串行队列一次只能运行一个任务,所以提交给队列的每个任务对于队列中的其他任务都是至关重要的,因此可以使用串行队列来代替对竞争资源的锁定。
调度队列相对于其他调度队列同时执行它们的任务。任务的序列化仅限于单个调度队列中的任务。
在您的情况下,您可以使用串行调度队列
当您希望任务以特定顺序执行时,串行队列很有用。串行队列一次只执行一个任务,并且总是从队列的头部拉取任务。您可以使用串行队列而不是锁来保护共享资源或可变数据结构。与锁不同,串行队列确保任务以可预测的顺序执行。只要您将任务异步提交到串行队列,队列就永远不会死锁。
与为您创建的并发队列不同,您必须显式创建和管理要使用的任何串行队列。您可以为您的应用程序创建任意数量的串行队列,但应避免仅将创建大量串行队列作为同时执行尽可能多的任务的手段。如果要同时执行大量任务,请将它们提交到全局并发队列之一。创建串行队列时,请尝试确定每个队列的用途,例如保护资源或同步应用程序的某些关键行为。
dispatch_queue_t queue;
queue = dispatch_queue_create("com.example.MyQueue", NULL);
此代码显示了创建自定义串行队列所需的步骤。dispatch_queue_create 函数有两个参数:队列名称和一组队列属性。调试器和性能工具显示队列名称以帮助您跟踪任务的执行方式。队列属性保留供将来使用,并且应该为 NULL。
Grand Central Dispatch 提供了一些功能,让您可以从应用程序访问几个常见的调度队列:
使用dispatch_get_current_queue函数进行调试或测试当前队列的身份。从块对象内部调用此函数会返回块被提交到的队列(并且它现在可能正在运行)。从块外部调用此函数会返回应用程序的默认并发队列。
使用dispatch_get_main_queue函数获取与应用程序主线程关联的串行调度队列。此队列是为 Cocoa 应用程序和调用 dispatch_main 函数或在主线程上配置运行循环(使用 CFRunLoopRef 类型或 NSRunLoop 对象)的应用程序自动创建的。
使用dispatch_get_global_queue函数来获取任何共享并发队列。
注意:您不需要保留或释放任何全局调度队列,包括并发调度队列或主调度队列。任何保留或释放队列的尝试都将被忽略。
来源:并发编程指南