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)进行。

  • 相关阅读:
    jQuery 基本选择器
    JavaScriptif while for switch流程控制 JS函数 内置对象
    JavaScrip基本语法
    数据库 存储引擎 表的操作 数值类型 时间类型 字符串类型 枚举集合 约束
    数据库基础知识 管理员 用户登录授权的操作
    粘包的产生原理 以及如何解决粘包问题
    socket TCP DPT 网络编程
    2018年年终总结
    Android技术分享
    No accelerator found
  • 原文地址:https://www.cnblogs.com/ZkbFighting/p/9033740.html
Copyright © 2011-2022 走看看