zoukankan      html  css  js  c++  java
  • C#多线程学习笔记之(abort与join配合使用)(转)

    今天刚开始学多线程,尽管以前用过一点点,但是只是照着网上代码抄,没有真正理解,现在回过头来想研究研究,慢慢弄懂,下面就是我在网上所找资料的例子,相信大家都看过,做了小点改动

    View Code
    1 namespace 多线程
    2 {
    3 public class Simple
    4 {
    5
    6 public static int Main()
    7 {
    8 Console.WriteLine("Thread Start/stop/join sample");
    9 Alpha alpha = new Alpha();
    10 Thread t = new Thread(new ThreadStart(alpha.Beta));
    11 t.Start();
    12 while (!t.IsAlive) Thread.Sleep(1);
    13 t.Abort();
    14 //t.Join();
    15 Console.WriteLine("alpha.Beta 已经结束,执行状态为"+t.IsAlive.ToString()+"线程状态为:"+t.ThreadState.ToString());
    16 try
    17 {
    18 Console.WriteLine("试图重新启动 alpha.Beta");
    19 t.Start();
    20 }
    21 catch(ThreadStateException) {
    22 Console.WriteLine("ThreadStateException 试图重新启动t线程");
    23 Console.WriteLine("t线程终止后不能被重启");
    24 Console.ReadLine();
    25 }
    26 return 0;
    27 }
    28
    29 }
    30 public class Alpha {
    31 public void Beta() {
    32 while (true) {
    33 Console.WriteLine("Alpha.Beta 正在运行");
    34 }
    35 }
    36 }
    37 }
     1 namespace 多线程
    2 {
    3 public class Simple
    4 {
    5
    6 public static int Main()
    7 {
    8 Console.WriteLine("Thread Start/stop/join sample");
    9 Alpha alpha = new Alpha();
    10 Thread t = new Thread(new ThreadStart(alpha.Beta));
    11 t.Start();
    12 while (!t.IsAlive) Thread.Sleep(1);
    13 t.Abort();
    14 //t.Join();
    15 Console.WriteLine("alpha.Beta 已经结束,执行状态为"+t.IsAlive.ToString()+"线程状态为:"+t.ThreadState.ToString());
    16 try
    17 {
    18 Console.WriteLine("试图重新启动 alpha.Beta");
    19 t.Start();
    20 }
    21 catch(ThreadStateException) {
    22 Console.WriteLine("ThreadStateException 试图重新启动t线程");
    23 Console.WriteLine("t线程终止后不能被重启");
    24 Console.ReadLine();
    25 }
    26 return 0;
    27 }
    28
    29 }
    30 public class Alpha {
    31 public void Beta() {
    32 while (true) {
    33 Console.WriteLine("Alpha.Beta 正在运行");
    34 }
    35 }
    36 }
    37 }

    这 段代码非常好懂,但是有一点我不懂的是我以前一直认为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()就不能终止线程吗?但是再对着两种结果和两个方法给出的介绍 仔细想想就不难得出以下结论:
    1.abort()的功能是用来终止调用此方法的线程的,只是在多数情况下,它需要一点时间,有些延迟(可能在短时间内此线程还在执行)...
    2.join() 方法它的功能不是终止线程,而是在t线程终止之前,阻止正在结束(调用了abort()方法但还未结束)的t线程执行,同时使主线程等待,直到t线程终止 (也就是abort()方法终止过程完毕)了再执行下面的代码,打印出来的结果,执行状态就为FALSE,线程状态也为停止了


    注意:在没有调用JOIN方法前,这段代码的执行结果可能为图中两种结果,都会存在,这可能根据电脑的不同,abort()执行时间有关,所以,这里join保证了我们在执行下面的代码时,t线程实现了“真正”的终止,我想这就是join用在abort()后的妙处吧!

  • 相关阅读:
    hdu 5524 Subtrees 递推
    一些数论函数
    hdu 5480 Conturbatio (前缀和)
    hdu 5479 Scaena Felix (好坑的简单题)
    hdu 5465 Clarke and puzzle(树状数组 或 前缀和 + Nim游戏)
    uva 10534 Wavio Sequence(LIS)
    MFC简单绘制安卓机器人
    解决kubuntu(KDE4.8.5桌面环境)找不到中文语言包
    Windows系统完全退出VMware方法
    【VC6.0】getline需要输入2次回车才会结束的BUG修复方法
  • 原文地址:https://www.cnblogs.com/xyqCreator/p/2854377.html
Copyright © 2011-2022 走看看