          2 j=4 <NSThread: 0x28040e3c0>{number = 3, name = (null)}
          2 j=5 <NSThread: 0x28040e3c0>{number = 3, name = (null)}
          
+         总结：异步串行，只会开启一条线程，顺序执行， 也就是j一定在i后面才能打印
+         
          */
     }
     

        print("1 \(Thread.current)")
        let queue = DispatchQueue.init(label: "serialQueueAsync")
        queue.async {
            for i in 0...5 {
                print("2 i=\(i) \(Thread.current)")
            }
        }
        queue.async {
            for j in 0...5 {
                print("2 j=\(j) \(Thread.current)")
            }
        }
        print("3 \(Thread.current)")
        
        /*
         并发执行。 不在主线程
         开启新线程
         
         1 <NSThread: 0x280466b00>{number = 1, name = main}

@objc class QueueTestController: UITableViewController {
    
    //    除了主队列以外的所有异步执行都会新建线程, 并发执行。
    //    在主队列下的任务不管是异步任务还是同步任务都不会开辟线程，任务只会在主线程执行。
    //    异步串行，只会开启1条线程，在子线程中顺序执行

    //    serial将会执行完一个任务才会开始下一个，
    //    concurrent触发完一个就立即进入下一个，而不管它是否已完成（同时）
    
    //    同步（sync）：不会开启新线程，在当前线程中顺序执行
    //    异步（async）：具备开启新线程能力 （主线程异步不开启新线程，非主线程异步开启新线程）

    lazy var scenes = [
        [
            "title":"主队列，同步 -> 1 死锁",
            "action":"mainQueueSync"
        ],
        [
            "title":"主队列，异步 -> 132 顺序执行，没有开启新线程",
            "action":"mainQueueAsync"
        ],
        [
            "title":"串行队列，同步 -> 123 顺序执行，没有开启新线程",
            "action":"serialQueueSync"
        ],
        [
            "title":"串行队列，异步 -> 132 顺序执行，只开启1条新线程",
            "action":"serialQueueAsync"
        ],
        [
            "title":"并行队列，同步 -> 123 顺序执行，没有开启新线程",
            "action":"concurrentQueueSync"
        ],
        [
            "title":"并行队列，异步 -> 132 并发执行，开启新线程",
            "action":"concurrentQueueAsync"
        ],
        [
            "title":"并行队列，异步 -> 1 2 333333333 异步执行需要时间",
            "action":"concurrentQueueAsync2"
        ],
        [
            "title":"并行队列，异步->同步 混合情况",
            "action":"concurrentQueue_Sync_Async"
        ],
        
    ]
    
    override func viewDidLoad() {
