‫欢迎回来｡
‫在这个视频中, 我想谈谈加入和活着｡
‫所以join是线程或者线程类拥有的一种方法, 我们可以使用它, 它作为一个属性是活跃的｡
‫我们在这里创建一个线程, 或者两个线程, 我创建了两个方法和线程,
‫一个函数和函数线程.
‫而他们所做的只是说他们已经开始了｡
‫因此, 第三个函数启动, 函数线程也启动
‫所以现在你可以继续复制, 或者真实的构建自己, 然后继续｡
‫在这里, 我只想说域线程开始了, 最后说主线程结束了｡
‫到目前为止没有什么新的｡
‫例如, 如果我们从Control 5开始, 控制台将保持唤醒状态｡
‫主线程已启动, 主线程已结束｡
‫按任意键继续｡
‫好吧, 我会的
‫所以你可以看到它开始了, 它结束了, 这发生得真实的的, 真的很快｡
‫所以这里没发生什么事｡
‫所以现在让我们改变一下｡
‫让我们在那里创建一些线程｡
‫因此, 让我们创建一个新线程, 称为线程1｡
‫所以线程｡
‫为了使用线程, 我们需要使用系统线程来实现｡
‫现在我们可以使用线程了, 我将把这一个线程称为线程一｡
‫它要做的就是创建一个新线程, 调用线程一的函数.
‫运行这段代码, 它只会调用方法.
‫接下来是另一个线程, 我将称之为线程2, 它也是一个线程, 这里是运行线程｡
‫如您所见, 有多个重载线程启动､ 参数化线程启动和线程启动｡
‫所以我们要做的就是从这个线程开始｡
‫所以start是一个线程启动委托, 它表示当线程开始执行时要调用的方法｡
‫所以这就是我们的方法｡
‫所以这个线程或者第三个函数, 实际上不是一个方法, 它是一个函数,
‫因为它不在一个面向对象的类中.
‫但是不管怎样, 让我们继续创建这个函数｡
‫如你所见, 这里不需要括号因为我们这里并不称之为委托.
‫好吧, 我会的
‫接下来, 我们需要做的就是启动这些线程｡
‫让我们从一个点开始, 再从一个点开始｡
‫我将按下控制键f5来启动它, 并看到主线程启动, 主线程结束, 第一个函数线程启动,
‫第三个函数线程启动｡
‫所以它们没有结束, 因为我们还没有实现任何结束消息｡
‫现在, 让我们在这两个线程上使用joint方法｡
‫因此, 线程一个点连接, 让我们看看什么连接我们｡
‫Joint会阻塞调用线程, 直到此实例表示的红色终止, 同时继续执行标准的com和发送消息泵送｡
‫所以我们要做的就是简单地将这两个线程连接起来｡
‫所以这个线程和主线程, 就是这个joint方法所做的, 它在那一段时间阻塞了主线程.
‫所以它是由主线程调用的｡
‫这就是它阻塞主线程的原因｡
‫因此, 这通常被称为阻塞调用线程｡
‫在我们的例子中, 调用线程是主线程, 因为当我们调用它时, 我们在主线程内｡
‫所以我们接下来要做的就是加入第二个线程｡
‫我们把这个和这两个连接起来, 在控制台上写点东西.
‫假设线程一个函数完成了｡
‫让我们为第二个做同样的事情｡
‫所以我们再运行一次, 实际上不会发生什么｡
‫我来吧｡
‫按下控制器5这样我的控制台就能保持唤醒状态｡
‫主线程启动第三个函数启动第一个函数启动｡
‫而在这里它应该被称为thread to function｡
‫好了, 我们现在说线程1和线程2完成了, 之后只完成了主线程.
‫所以这不是什么新奇的东西｡
‫它只是一步一步地执行开发工作｡
‫这就是这里的样子｡
‫不过, 我们来做点有趣的事｡
‫让我们在这里加一个睡眠｡
‫让线程休眠3秒｡
‫线程休眠时间为3000毫秒｡
‫这样做的结果是, 这个方法只会说方法, 线程启动, 然后等待3秒钟｡
‫现在让我们再运行一次, 实际上, 让我们再运行一次, 控制f5｡
‫所以这里, 函数, 开始吧｡
‫然后过一段时间, 线程化一个函数｡
‫好了, 好了
‫让我真实的重现一下｡
‫第三个线程开始运行, 3秒后, 您可以看到第三个函数完成, 第三个函数完成, 主线程结束｡
‫所以主线程会一直等待, 直到主线程或第三个线程完成｡
‫这一切之所以发生是因为我们在这里加入了它｡
‫所以我们加入第一个线程, 我们说, 好的, 请等待, 直到我们完成｡
‫现在如果我们考察一下联合法, 还有其他有趣的事情要考虑｡
‫这里有多个重载, 所以你可以看到, 这里只有一个或者我们没有参数或者我们给出的参数,
‫但是有多个｡
‫所以我们可以在这里再加一个参数, 也就是我们在继续之前要等待的时间｡
‫在这里, 我将使用if thread dot, 实际上它是第三个线程, 连接占用了特定的时间量,
‫您可以看到毫秒超时｡
‫假设我们等待1/2,
‫然后给予该线程1/2终止, 如果它在1/2时间内终止, 我们就说线程1的函数完成, 否则我们就说线程1的函数在1/2时间内未完成｡
‫好了, 我们去掉这里的连接点, 用这个来替换所有的代码｡
‫现在让我们再运行一次｡
‫控制五个｡
‫所以前面的函数有三分之一没有在1/2线程内完成, 到函数完成主线程结束｡
‫正如你所看到的, 它没有在指定的时间内完成｡
‫但现在让我们在这里添加另一个代码, 因为我们从未见过这个线程｡
‫一项功能已完成｡
‫因此, 让我们添加一些东西, 如线程一返回到main的函数｡
‫所以这意味着它基本上完成了｡
‫或者也许不是主要的｡
‫但是为了颜色, 让我们用控制器5再运行一次｡
‫对功能的威胁开始了, 让我再调用一次, 就像OC主威胁结束了, 然后你看到,
‫只有在那个时间之后, 只有在它的3秒之后, 它说第三个功能恢复了颜色｡
‫所以主要的威胁已经完成了, 然后才回到颜色, 这是主要的威胁｡
‫直到那时, 它才来到井, 30行或实际上后来｡
‫所以它是用main方法完成的, 只有这样, 这里的代码才被执行｡
‫因此, 正如您所看到的, 它只阻塞了主线程的1/2｡
‫它没有阻止主要的威胁, 直到它完成｡
‫因此, 它表示在继续执行静态注释和合并泵送的同时, 阻塞调用线程,
‫直到该实例所表示的线程终止或指定的时间过去｡
‫所以你可以说, 主线程, 请等待1/2, 如果它没有发生,
‫或者第三个线程没有完成它的内容, 那么它将继续｡
‫它将加入线程2, 然后它只会说, 好了,
‫我完成了, 线程主威胁完成了, 线程1的函数仍在运行, 或者线程1仍在运行, 它仍在休眠,
‫然后执行代码｡
‫但它并没有像你在这里看到的那样及时完成｡
‫所以主线没有再等｡
‫它只是说, 好吧, 我要继续, 我要离开你继续前进｡
‫这就是连接线程的方法｡
‫你可以看到这里, 这就是它的工作原理｡
‫现在让我们看看这是一个活的财产｡
‫因此, 如果线程1是活动的, 那么就有这个属性, 正如你所看到的, 它会得到一个值,
‫指示当前线程的执行状态, 这意味着线程是完成了还是没有完成？
‫所以这里说线程是否还在运行｡
‫因此, 如果在执行此代码时它仍在运行, 则执行一些操作｡
‫所以我只写一些东西, 比如线程1仍然在做事情,
‫所以它仍然在执行和运行代码, 否则我只会说线程1已经完成, 所以CW线程1已经完成｡
‫好吧, 我会的
‫当然, 我们现在需要完成这个字符串｡
‫让我们再检查一遍｡
‫主线程结束, 实际上我的控制台将关闭｡
‫让我们从控制f开始, 启动五个主线程, 启动一个函数线程, 依此类推｡
‫所以它不是在1/2内完成的｡
‫然后执行线程功能2｡
‫所以它说, 好吧, 我不会再等了｡
‫主线程｡
‫因此, 它执行线程2｡
‫第三个还在做事情｡
‫所以这意味着线程1是活动的, 被执行, 只有在主要威胁结束之后｡
‫执行第38行的代码, 然后调用或执行返回颜色的线程一函数｡
‫好吧, 我会的
‫所以这就是你可以检查的｡
‫您可以简单地检查｡
‫好吧, 我会的
‫威胁还活着吗？
‫在此基础上, 你可以执行一些东西, 这非常有用｡
‫假设我们想看到威胁1仍然在定期地做一些事情｡
‫假设我们在这里用了一个for循环, I等于0, I小于10, I ++｡
‫所以在for循环中我想运行这段代码｡
‫它要做的就是说威胁还在做事情然后它会休眠300毫秒｡
‫所以睡300个, 这意味着在我们的威胁完成之前, 我们将有10个死刑执行｡
‫让我们再执行一次｡
‫一号线程还在做事情完成, 完成, 完成｡
‫正如你所看到的, 它没有执行10次, 即使威胁休眠有300或3000秒和毫秒,
‫而这个只有300毫秒｡
‫它执行了多次线程1｡
‫如您所见, 在线程函数返回的位置存在重叠｡
‫正如您所看到的, 这个for循环稍后才执行｡
‫因此, 顺序如下｡
‫我们开始第一个线程｡
‫我们从右边开始第一个线程｡
‫等待了1/2, 您可以看到,
‫我们有这个1/2连接, 所以我们已经丢失了三次对slip的执行, 这意味着这个线程1仍在执行操作, 实际上只执行了六次或七次｡
‫然后线程一的函数返回, 因为它启动了｡
‫然后它又等了半分钟｡
‫然后什么都没发生｡
‫直到那时, 它才开始做所有这些美丽的事情｡
‫因为这个for循环执行了十次, 所以它会多次运行这个sleep, 直到它恢复颜色｡
‫第三个完成的是超快速执行的｡
‫所以它不会等, 因为那里没有睡眠｡
‫但一般来说, 这就是你能做的｡
‫这样就可以大体检查出来, 难道是命？
‫它还活着吗？
‫它是活着的时候做一些事情, 还是活着的时候做一些其他的事情, 然后什么都不做, 或者做了其他的事情｡
‫这是一个非常基本的, 使用连接的例子, 我希望你们能理解这个概念｡
‫下一段视频再见｡
‫我们我们会检查出任务｡