func asyncmethod() {
DispatchQueue.global().async {
DispatchQueue.main.sync {
print("DispatchQueue.main.sync task \(Thread.current)")
}
print("DispatchQueue.global().async task \(Thread.current)")
}
}
DispatchQueue.main.sync必须用于在全局队列当中,因为async执行是异步操作。不能单独使用,因为这步操作会阻塞当前线程 执行完线程中的操作之后才会继续向下执行。
同步和异步在这里是线程概念,同步不会创建新的线程,会阻塞当前的线程在这个线程里执行任务。而异步则不会阻塞当前线程,会选择在恰当的时机在当前线程或者另开线程执行任务(看系统如何调度),开始任务和完成任务时间是不确定的。
串行队列,后一个任务等待前一任务结束后再执行,按添加顺序一个一个执行。
并行队列,后一个任务不会等待前一个任务,不等前一个任务完成就会分配新任务。
串行和并行,这里对应的是队列的概念。队列负责管理多个任务,队列拥有一个线程池,池子里有一个或者多个线程,它按要求将每个任务调度到某一个线程执行。
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "show Red", style: .plain, target: self, action: #selector(pushToRed))
print("thread is \(Thread.current)")
DispatchQueue.global().sync {
print("thread is \(Thread.current)")
DispatchQueue.global().sync {
print("thread is \(Thread.current)")
print("1")
print("2")
print("3")
print("4")
print("5")
print("6")
print("7")
}
}
// asyncmethod()
// Do any additional setup after loading the view.
}
thread is <NSThread: 0x60000297aac0>{number = 1, name = main}
thread is <NSThread: 0x60000297aac0>{number = 1, name = main}
thread is <NSThread: 0x60000297aac0>{number = 1, name = main}
1
2
3
4
5
6
7
所以并不是说全局队列中的任务就不能在主线程执行,事实证明还是可以的。