如何理解多线程中的队列

2018/7/11 posted in  iOS
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

所以并不是说全局队列中的任务就不能在主线程执行,事实证明还是可以的。