zoukankan      html  css  js  c++  java
  • C#简单线程同步例子

    1.利用Thread的Join方法,实现1个主线程与多个子线程

        1.1 主线程创建一个新线程:Thread newThread = new Thread(...);

        1.2 主线程让新线程开始执行:newThread.Start(....);

            1.2.1 流程1:此时新线程仍然在执行

                1.2.1.1 主线程对新线程执行Join: newThread.Join(); 主线程会阻塞(卡)在这个语句。

                1.2.1.2 新线程执行完毕

                1.2.1.3 主线程继续执行剩余语句。此流程完毕。

            1.2.2 流程2:此时新线程已经执行完毕

                1.2.2.1 主线程对新线程执行Join: newThread.Join(); 这个语句会立即执行完毕

                1.2.2.2 主线程继续执行剩余语句。此流程完毕。

    例子:

     1 function 主线程方法()
     2 {
     3     输出("主线程_步骤1_准备执行子线程");
     4 
     5     Thread 子线程1 = new Thread(子线程方法1);
     6     Thread 子线程2 = new Thread(子线程方法2);
     7     
     8     子线程1.Start();
     9     子线程2.Start();
    10 
    11     输出("主线程_步骤2_等待【子线程1】");
    12     子线程1.Join();
    13     //1.等待【子线程1】运行完毕,也就是等【子线程1】从【子线程方法1】里return出来。
    14     //2.如果【子线程1】没执行结束,也就是【子线程1】仍然在执行【子线程方法1】里的代码,则主线程会一直阻塞(等待)在这里。
    15     //3.如果运行这个语句之前,【子线程1】已经运行结束(从【子线程方法1】里return出来),则这个语句会立即运行完成,并且不会产生任何异常或错误。
    16     输出("主线程_步骤3_【子线程1】已经退出");
    17 
    18     输出("主线程_步骤4_等待【子线程2】");
    19     子线程2.Join();
    20     输出("主线程_步骤5_【子线程2】已经退出");
    21 
    22     输出("主线程_步骤6_运行完毕");
    23 }
    24 
    25 function 子线程方法1()
    26 {
    27     休息(1秒);//Thread.Sleep(1000)
    28     输出("子线程1_步骤1_开始运行");
    29     休息(1秒);
    30     休息(1秒);
    31     休息(1秒);
    32     休息(1秒);
    33     休息(1秒);
    34     输出("子线程1_步骤1_运行完毕");
    35 }
    36 
    37 function 子线程方法2()
    38 {
    39     休息(1秒);
    40     休息(1秒);
    41     输出("子线程2_步骤1_开始运行");
    42     休息(1秒);
    43     输出("子线程2_步骤1_运行完毕");
    44 }
    45 
    46 程序运行结果:
    47 输出:主线程_步骤1_准备执行子线程
    48 输出:主线程_步骤2_等待【子线程1】
    49 
    50 输出:子线程1_步骤1_开始运行
    51 输出:子线程2_步骤1_开始运行
    52 输出:子线程2_步骤1_运行完毕
    53 输出:子线程1_步骤1_运行完毕
    54 
    55 输出:主线程_步骤3_【子线程1】已经退出
    56 输出:主线程_步骤4_等待【子线程2】
    57 输出:主线程_步骤5_【子线程2】已经退出
    58 
    59 输出:主线程_步骤6_运行完毕

    2.利用AutoResetEvent事件通知,实现1个主线程与1个子线程之间的同步

     1 private static AutoResetEvent ThreadEvent = new AutoResetEvent(false);//子线程必须等待主线程发出事件后,才能执行
     2 
     3  
     4 
     5 private static void MainThread()
     6 
     7 {
     8 
     9     Thread newThread = new Thread(Program.NewThreadFunction);
    10     Console.WriteLine("Main Thread :Start new thread");
    11 
    12     newThread.Start();
    13 
    14     Thread.Sleep(5000);//休息5秒
    15 
    16     Console.WriteLine("Main Thread :Allow new thread continue");
    17 
    18     ThreadEvent.Set();//允许子线程继续运行
    19 
    20     Console.ReadKey(true);
    21 
    22 }
    23 
    24  
    25 
    26 private static void NewThread()
    27 
    28 {
    29 
    30     Console.WriteLine("New Thread :Start, Wait for Main Thread event");
    31 
    32     ThreadEvent.WaitOne();//如果主线程不执行ThreadEvent.Set();则子线程会一直阻塞(卡)在这里
    33 
    34     Console.WriteLine("New Thread :Continue");
    35 
    36 }
    37 
    38 运行结果:
    39 
    40 输出:Main Thread :Start new thread
    41 
    42 输出:New Thread :Start, Wait for Main Thread event
    43 
    44 输出:Main Thread :Allow new thread continue
    45 
    46 输出:New Thread :Continue
  • 相关阅读:
    jQuery.messager 使用
    对应后台传json ajax 获取值判断
    easyui datagrid nowrap 使用方法
    easyui combogrid setValues
    去除字符串中所有的逗号
    datagrid loadData 使用方法
    使用git下载一个项目
    java中读取文本文件的时候@Test方法中没有中文乱码,但是@Controller中却有中文乱码
    IDEA启动项目的时候,控制台中显示的都是乱码
    微信流量主点击量与曝光量是什么意思
  • 原文地址:https://www.cnblogs.com/xxxteam/p/2962033.html
Copyright © 2011-2022 走看看