在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
今天刚开始学多线程,尽管以前用过一点点,但是只是照着网上代码抄,没有真正理解,现在回过头来想研究研究,慢慢弄懂,下面就是我在网上所找资料的例子,相信大家都看过,做了小点改动
View Code
1 namespace 多线程 这段代码非常好懂,但是有一点我不懂的是我以前一直认为abort()方法会使线程终止,为什么还要调用线程t的join方法呢?官方给的解释是abort():以开始终止此线程的过程,调用此方法通常会终止此线程,join():阻止调用某个线程,直到某个线程终止为止。当时死都想不通这两句话,直到把t.IsAlive(表示当前线程的执行状态)和t.ThreadState(该值包含线程的状态)打印出来后再想明白,现在先看看上面代码的运行结果: 奇怪,为什么线程abort()后isalive执行状态还是为TRUE呢,再看线程状态为AbortRequested,这意思是说线程已调用abort,但线程还未停止,于是再想想线程没停止,isalive属性为TRUE就变得合理了,那下面TRY语句块内再对线程重启就会产生错误了,都没停止何来产生重启呢? 但是问题还没有解决,如何才能让线程终止呢,难道abort不能让纯种终止吗?好了,先不要想那么多,我们把上述代码中t.join()注释符号给去掉,再来运行一下程序,结果如下: 好了,现在看看执行关态和线程状态我们得知线程终止了,而我们知道,当一个线程再调用abort()后是不能再start()了,所以同样会抛出异常,执行catch语句。综合两种情况来看,开始我还以为,难道只用abort()不用join()就不能终止线程吗?但是再对着两种结果和两个方法给出的介绍仔细想想就不难得出以下结论: 注意:在没有调用JOIN方法前,这段代码的执行结果可能为图中两种结果,都会存在,这可能根据电脑的不同,abort()执行时间有关,所以,这里join保证了我们在执行下面的代码时,t线程实现了“真正”的终止,我想这就是join用在abort()后的妙处吧! |
请发表评论