zoukankan      html  css  js  c++  java
  • 多线程小结(3)

    来源

    【多线程-Join()方法】

    一. 什么时候使用Join()方法:

    当一个线程操作需要等待另一个线程执行完毕之后才能继续进行时,使用Join()方法。Join方法会等到使用该方法的线程结束后再执行下面的代码。

    就是当A线程,要等到B线程完成之后再执行A的话,就用到Join方法了。

    因为是得等到B线程先执行,所以是:B.Join();(Join是啥事都依着自己,自己先咋桌咋桌,别人等着他==>凑不要脸;那个Suspend这是你们先跑吧,我不跟你们争==>当代雷锋)

     1 namespace ThreadJoin
     2 {
     3     class Program
     4     {
     5         private static Thread subthread;
     6         private static string name = "";  
     7         static void Main(string[] args)
     8         {
     9             Console.WriteLine("xxxxxx:");
    10             //声明一个新的线程,这里新的线程去执行Getshow的方法
    11             //说一点哈:这个声明一个方法,逐步执行的话,他不会进GetShow方法里面,直接跳过
    12             subthread = new Thread(new ThreadStart(GetShow));
    13             Console.WriteLine("xxxxxx:");
    14             subthread.Start();  //开启线程  
    15             subthread.Join();//等待>当subthread线程执行完毕之后,才执行下面的语句 
    16             // Console.WriteLine();这样的代码,是主线程的代码
    17             //本来执行过 subthread.Join(); 后要执行下面的console的,但是现在因为加入了Join
    18             //所以得先去执行GetShow方法了。
    19             Console.WriteLine("xxxxxx:");
    20             Console.WriteLine("姓名:" + name);
    21 
    22             Console.WriteLine("主线程");
    23 
    24 
    25             Console.ReadKey();
    26 
    27         }
    28         static void GetShow()
    29         {
    30             Console.WriteLine("输入姓名:");
    31 
    32             name = Console.ReadLine();
    33             Console.WriteLine("次线程");
    34         }  
    35     }
    36 }
    View Code

    Join()方法可以用于简单线程项目的线程同步。

    简单的理解,结识:假如有多个线程:但是我想先让B线程跑,B跑完后,其他的再跑;

    那就给B:B.Join();

     【多线程-Suspend()和Resume()方法】还是没有吃透彻呢

    Suspend()用于挂起线程,Resume()用于继续执行已经挂起的线程。

    (感觉和Join有点差不多:Join是啥事都依着自己,自己先咋桌咋桌,别人等着他==>凑不要脸;这个Suspend这是你们先跑吧,我不跟你们争==>当代雷锋。)

    可以使用这两个方法进行线程的同步,和Start()方法有些类似的是:在调用Suspend方法后不会立即的停止,而是执行到一个安全点后挂起。//这个安全点还没有Get到呢

    意思就是,调用Suspend方法后,先让一个正在跑的进程停下来,其他的先跑;继续让他跑就是Resume这个方法。

    在开启子线程后立即让他挂起,直到执行了Resume()后恢复线程的执行。

     1 namespace ThreadJoin
     2 {
     3     class Program
     4     {
     5         private static Thread subthread;
     6         private static string name = "";
     7         static void Main(string[] args)
     8         {
     9             subthread = new Thread(new ThreadStart(GetShow));
    10             subthread.IsBackground = false;
    11             subthread.Name = "子线程";
    12             subthread.Start();   //开启线程
    13             subthread.Suspend(); //挂起
    14             Console.WriteLine(subthread.Name + "挂起");
    15            string name= Thread.CurrentThread.Name;
    16            Console.WriteLine("当前线程的名字{0},后台线程:{1}", name, Thread.CurrentThread.IsBackground + ",结束");
    17             subthread.Resume();  //执行
    18             Console.WriteLine("主线程结束");
    19             Console.ReadKey();
    20         }
    21         static void GetShow()
    22         {
    23             Console.WriteLine("输入姓名:");
    24             name = Console.ReadLine();
    25             Console.WriteLine("执行");
    26         }
    27     }
    28 }
    View Code

     在开启子线程后立即让他挂起,直到执行了Resume()后恢复线程的执行。注意如果在线程没有挂起时去调用Resume()方法会出现异常,所有使用这样的方法进行线程线程同步已经不推荐使用了。F12查看该方法看到已经进行了Obsolete进行了标记。

    线程的同步可以使用互斥体(Mutex)和信号量(Signaling)进行。

  • 相关阅读:
    IBM斥资340亿美元收购红帽
    单例模式讨论篇:单例模式与垃圾回收
    Xshell拖拽上传文件插件
    理想的程序员
    Android学习之路
    springboot更改启动logo,佛祖保佑 ,永不宕机 , 永无BUG
    Java多线程实现的四种方式
    IntelliJ IDEA
    Jrebel最新激活破解方式(持续更新)
    PyCharm 2018.2.4永久破解办法
  • 原文地址:https://www.cnblogs.com/ZkbFighting/p/9033740.html
Copyright © 2011-2022 走看看