C# 线程通信 一

C#多线程通信

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading;
 6 using System.Threading.Tasks;
 7
 8 namespace App.Test.Csharep.线程通信
 9 {
10     public class MainThread
11     {
12         /// <summary>
13         /// 开始执行通知
14         /// </summary>
15         private EventWaitHandle dataChangeEvent = new AutoResetEvent(false);
16
17
18         public int openDoorNum = 0;
19
20         /// <summary>
21         /// 测试流程: 完成10次开门后,每次开门完成都要完成进门操作,主线程完成开门,子线程完成进门
22         /// </summary>
23         public void Run()
24         {
25             var thread = new Thread(new ThreadStart(InputDoor));
26             thread.Name = "进门线程";
27             thread.IsBackground = true;
28             thread.Start();
29
30             Thread.Sleep(500);
31
32             for (int i = 0; i < 10; i++)
33             {
34                 openDoorNum++;
35                 Console.WriteLine("AA完成开门第" + openDoorNum + "次开门");
36
37                 /// 通知已经完成开门操作
38                 dataChangeEvent.Set();
39
40                 /// 在执行dataChangeEvent.Set()后,dataChangeEvent.WaitOne()开始获取信号,为防止没有获取到信号时
41                 /// 又执行dataChangeEvent.Set()方法,则上次的dataChangeEvent.WaitOne()需要执行的代码不会被执行,
42                 /// 所以暂时休眠,否则进门可能次数不够
43                 Thread.Sleep(1);
44             }
45
46             Console.Read();
47         }
48
49         /// <summary>
50         /// 完成进门操作
51         /// </summary>
52         private void InputDoor()
53         {
54             ///收到开门的线程通知,WaitOne方法如果在通知线程set()前如果能及时收到信号,则一直会处于阻塞代码
55             /// 如果在dataChangeEvent.WaitOne()过程中获取信号同时,被调用线程给set()了,则dataChangeEvent.WaitOne()
56             /// 应该是收不到信号的,所以要在调用线程中执行完dataChangeEvent.set()后应该休眠一会,在调用dataChangeEvent.set()
57
58             /// 保证子线程一直在处于运行状态
59             while (true)
60             {
61                 //if (dataChangeEvent.WaitOne())
62                 //{
63                 //    Console.WriteLine("\tA第" + openDoorNum + "次进门");
64                 //}
65
66                 /// 等待100毫秒,没有收到信号则释放,继续往下面执行,date会被赋值
67                 if (dataChangeEvent.WaitOne(100, false))
68                 {
69                     Console.WriteLine("\t 【" + Thread.CurrentThread.Name + "】A第" + openDoorNum + "次进门");
70                 }
71             }
72         }
73     }
74 }
时间: 2024-11-08 23:30:22

C# 线程通信 一的相关文章

Java多线程编程核心技术读书笔记(3)-线程通信

线程是操作系统中独立的个体,但是这些个体如果无法经过特殊的处理就不能成为一个整体.线程间通信可以实现线程间的信息互换.相互唤起等功能,是系统的交互性更加强大,大大提高CPU的利用率,同时还能让开发者对各个线程任务有清晰的把控和监督,最常用的线程通信方法就是--等待/通知机制. 一.等待/通知机制 1.wait() / notify() 等待/通知机制在生活中比比皆是,例如:厨师/服务员的菜品传递台.生产者/消费者模式,JDK中通过Object里面的两个方法 wait() / notify() 来

java 线程通信

java 线程通信使用wait notify 配合synchronized 当线程执行wait()时,会把当前的锁释放,然后让出CPU,进入等待状态.当执行notify/notifyAll方法时,会唤醒一个处于等待该 对象锁 的线程,然后继续往下执行,直到执行完退出对象锁锁住的区域(synchronized修饰的代码块)后再释放锁. 如下代码: public class ThreadTest { //声明一个线程可视化的list集合 public static List<String> lis

线程通信

线程通信 一 使用Synchronized的线程 1.当线程在系统内运行时,线程的调度具有一定的透明性,程序通常无法准确控制线程的轮换执行,但java也提供了一些机制来保证线程协调运行.Object类提供了wait(),notify()和notifyAll()三个方法,这三个方法属于Object类,但是必须由同步监视器来调用,可以分为以下两种情况:(1)对于使用synchronized修饰的同步方法,因为该类的默认实例this就是同步监视器,所以可以在同步方法中直接调用这三个方法(2)对于使用s

Thinking in Java---再谈线程通信

前面写过一篇关于线程通信的博客,但是只是简单的罗列了几种线程通信的形式及语法:这几天又把<>上对应的内容看了一遍,这一篇博客主要结合几个例子说明下几种线程通信方式的特点. 首先还是要明确线程通信要解决的问题是什么:考虑这么一个情况,我们现在要对一台车进行涂蜡和抛光,并且在进行抛光之前一定要保证已涂蜡,且在涂另一层蜡的时候,又要保证已经抛光:现在我们我们开启两个线程,一个负责涂蜡,另一个负责抛光:要想顺利的完成任务,那么显然这两个线程需要相互等待和协调.这就是线程通信的任务了–如果我们有一个任务

java多线程 - 线程通信

当线程在系统内运行时,程序通常无法准确控制线程的轮换执行,但是可以通过一些机制来保证线程协调运行. 由同步监视器对象协调线程 实现这种功能可以借助于Object类提供的wait().notify().notifyAll()三个方法(注意,这三个方法属于Object类,不属于Thread类).这三个方法必须由同步监视器来调用,可以分为两种情况: 对于同步方法,同步监视器默认是当前实例(this),所以可以在同步方法中直接调用这三个方法: 对于同步代码块,同步监视器是synchronized后括号里

ZeroMq实现跨线程通信

ZeroMq实现跨线程通信 之前在技术崇拜的技术经理指导下阅读了ZeroMq的基础代码,现在就将阅读的心得与成果记录一下,并重新模仿实现了一下经理的异步队列. 1.对外接口 //主要接口(1)void *ymq_attach (void *ctx_, int oid, void* sink_); (2)void *ymq_detach (void *ctx_, int oid); (3)void *ymq_register_timer (void *ctx_, int oid, int time

iOS-----线程同步与线程通信

线程同步与线程通信 多线程是有趣的事情,它很容易突然出现”错误情况”,这是由于系统的线程调度具有一定的随机性造成的.不过,即使程序偶然出现问题,那么是由于编程不当所引起的.当使用多个线程来访问同一个数据时,很容易”偶然”出现线程安全问题. 线程安全问题 关于线程安全问题,有一个经典的问题:银行取钱的问题.银行取钱的基本流程基本可以分为如下几个步骤. 用户输入账户.密码.系统判断用户的账户.密码是否匹配. 用户输入取款金额. 系统判断账户余额是否大于取款金额. 如果余额大于取款金额,则取款成功;如

JavaSE:多线程补充--线程通信

线程通信我认为是多线程中最难掌握的部分了,这里通过两个例子来说明一下. 第一个: 使用两个线程打印 1-100. 线程1, 线程2 交替打印 public class Print implements Runnable{ int i = 1; public void run(){ while(true){ synchronized(this){ if(i<100){ notify(); System.out.println(Thread.currentThread().getName() + &qu

Android线程通信

摘要 andriod提供了 Handler 和 Looper 来满足线程间的通信.例如一个子线程从网络上下载了一副图片,当它下载完成后会发送消息给主线程,这个消息是通过绑定在主线程的Handler来传递的. 正文 图解: 代码示例: /** * @author allin.dev * http://allin.cnblogs.com */ public class MainThread extends Activity { private static final String TAG = "M

JavaSE——线程通信

线程通信: 如果线程A和线程B持有同一个MyObject类的对象object,这两个线程会去调用不同的方法,但是它们是同步执行的,比如:线程B需要等待线程A执行完了methodA()方法之后,它才能执行methodB()方法.这样,线程A和线程B就实现了 通信. 线程通信中要用到的方法:wait()方法: 执行同步锁(obj对象)的该方法的线程进入堵塞状态,会释放对象的锁,java虚拟机把该线程放到该对象的等待池中,该线程如果要再次执行,则需要其他线程将它唤醒. 1 package tongxi