AutoResetEvent信号锁 waitone set 执行一次线程退出 挺不爽的地方
下边有个 循环调用线程写奇偶数的程序
class TheadTest
{
//定义一个Stream对象接收打开文件
private FileStream st;
//构造方法
public TheadTest()
{
}
public void Start()
{
//定义两个信号锁
AutoResetEvent ateA = new AutoResetEvent(false);
AutoResetEvent ateB = new AutoResetEvent(false);
//把信号锁加入到List中
List<AutoResetEvent> lst = new List<AutoResetEvent>();
lst.Add(ateA);
lst.Add(ateB); //定义带参数的输出偶数线程
Thread thrEven = new Thread(new ParameterizedThreadStart(OutPutEven));
thrEven.Name = "偶数线程";
//把两个信号锁传入线程
thrEven.Start(lst); //定义带参数的输出奇数线程
Thread thrOdd = new Thread(new ParameterizedThreadStart(OutPutOdd));
thrOdd.Name = "极数线程";
thrOdd.Start(lst);
} private void OutPutEven(object lst)
{
AutoResetEvent ateA = (lst as List<AutoResetEvent>)[0];
AutoResetEvent ateB = (lst as List<AutoResetEvent>)[1]; for (int i = 0; i < 100; i += 2)
{
//设置本线程为无信号
ateA.WaitOne();
//输出
Console.WriteLine(i);
//st = File.Open(@"C:/file.txt", FileMode.Open); //用来测试同时访问文件系统的
//st.Close();
ateB.Set(); //设置输出奇数线程有信号
//Thread.Sleep(500);
}
}
private void OutPutOdd(object lst)
{
AutoResetEvent ateA = (lst as List<AutoResetEvent>)[0];
AutoResetEvent ateB = (lst as List<AutoResetEvent>)[1];
//设置偶数线程先输出
ateA.Set();
for (int i = 1; i < 100; i += 2)
{
//设置本线程为无信号
ateB.WaitOne();
Console.WriteLine(10000);
//st = File.Open(@"C:/file.txt", FileMode.Open); //用来测试同时访问文件系统的
//st.Close();
ateA.Set(); //设置输出偶数线程有信号
//Thread.Sleep(500);
}
}
}

此时两个线程执行方法都在循环中没问题 ,程序是交互进行的,ateA 先执行,然后waitone ,等待ateB执行完发送set信号。
把其中一个循环去掉,
// for (int i = 1; i < 100; i += 2)
// {
//设置本线程为无信号
ateB.WaitOne();
Console.WriteLine(10000);
//st = File.Open(@"C:/file.txt", FileMode.Open); //用来测试同时访问文件系统的
//st.Close();
ateA.Set(); //设置输出偶数线程有信号
//Thread.Sleep(500);
// }
运行结果:

就运行了三行拉倒了,而且是
ateA 运行了两次,
ateB运行了一次。 没有循环只运行了一次,线程就结束了。
ateA 的循环即使发送
ateB.set()信号也没用了,线程已经关闭了,运行一次就关闭了,当然应该考虑到线程启动关闭的运行效率,应该就是这么个规矩,线程启动要执行哪个程序,执行完毕,
、线程自动退出。实际运行中,这里有些理解上挺不爽的,不知道别人怎么样。
从理解的角度上讲,线程应该一直在那启动着,给予set信号,线程执行程序开始运行,执行完后等待下次set信号,而不应该退出。
所以要想用上这个知识点在程序中,还需要改进不少。这个问题上次处理上位机时碰到,当时已经知道这个问题,今天因为上边的写法中,参数和加了一个循环,
导致自己出现错觉了,以为这种写法就可以给信号执行,没信号不执行,执行完之后线程挂起而不是退出的功能
AutoResetEvent信号锁 waitone set 执行一次线程退出 挺不爽的地方的更多相关文章
- 死锁、Lock锁、等待唤醒机制、线程组、线程池、定时器、单例设计模式_DAY24
1:线程(理解) (1)死锁 概念: 同步中,多个线程使用多把锁之间存在等待的现象. 原因分析: a.线程1将锁1锁住,线程2将锁2锁住,而线程1要继续执行锁2中的代码,线程2要继续执行锁1中的代码, ...
- 并发编程: GIL锁、GIL与互斥锁区别、进程池与线程池的区别
一.GIL 二.关于GIL性能的讨论 三.计算密集测试 四.IO密集测试 五.GIL与互斥锁 六.TCP客户端 七.进程池 八.进程什么时候算是空闲 九.线程池 一.GIL GIL Global In ...
- quartz源码分析——执行引擎和线程模型
title: quartz源码分析--执行引擎和线程模型 date: 2017-09-09 23:14:48 categories: quartz tags: [quartz, 源码分析] --- - ...
- Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行
Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执行 Semaphore控制同时访问的线程个数countdownlatch等待多个线程执行完本身线程再执 ...
- CPU的最小执行单位是线程,协程不需要qt支持...直接用现成的协程库就行了
协程也就在I/O操作上才有优势,Qt事件循环,本事很多I/O已经是异步了,利用好异步(虽然都说异步有点反人类思维).因为CPU的执行最小单位是线程,协程也只是在其之上又调度而已. 我的意思是利用好异步 ...
- 7.生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信)
/* * 生产者消费者 案例 (使用Lock 同步锁 方式,使用Condition完成线程之间的通信) * */ public class TestProductorAndConsumerForLoc ...
- C# Thread.Join的报错情形——论执行完的线程能够成功执行Join吗
结论: 能, 执行完的线程调用Join不会抛出错误. Thread.Join()是什么? Join()函数用于阻塞地等待线程结束, 其行为是在线程A中调用了线程B的Join()后, 线程A将一直阻塞在 ...
- c#中多线程同步Lock(锁)的研究以及跨线程UI的操作
本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程的同步,使用 ...
- c#中Lock(锁)的研究以及跨线程UI的操作
本文只针对C#中,多线程同步所用到的锁(lock)作为研究对象.由于想更直观的显示结果,所以,在做demo的时候,就把多线程通过事件操作UI的代码也写了出来,留作备忘和分享吧. 其实多线程 ...
随机推荐
- JSP+servlet简单登录实例
一个简单的jsp+servlet实例,实现简单的登录 转载▼ http://blog.sina.com.cn/s/blog_5c5bc9070100z7wb.html 开发环境myeclips ...
- python Requests库在处理response时的一些陷阱
python的Requests(http://docs.python-requests.org/en/latest/)库在处理http/https请求时还是比较方便的,应用也比较广泛.但其在处理res ...
- [Tex学习笔记]开方
$$\sqrt[n]{\frac{a}{b}}$$ $$\sqrt[\uproot{7}n]{\frac{a}{b}}$$
- 加快phpstorm、rubymine、pycharm系列IDE运行速度的方法
对jetbrains公司出品的IDE均有效,以rubymine为例: 打开C:\Program Files\JetBrains\RubyMine 6.3.3\bin,打开 rubymine.exe.v ...
- 每天一个 Linux 命令(8):cp 命令
cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参数.但是如果是在 ...
- IntelliJ IDEA内存优化最佳实践
[编者按]本文作者在和同事的一次讨论中发现,对 IntelliJ IDEA 内存采用不同的设置方案,会对 IDE 的速度和响应能力产生不同的影响. Don’t be a Scrooge and giv ...
- springboot + swagger
swagger用于定义API文档. 好处: 前后端分离开发 API文档非常明确 测试的时候不需要再使用URL输入浏览器的方式来访问Controller 传统的输入URL的测试方式对于post请求的传参 ...
- 113、ScrollView滑动到了最底部
ScrollView使用 http://www.cnblogs.com/androidsj/archive/2012/03/04/2379387.html 滚动到顶部判断:getScrollY() = ...
- CPA
CPA.CPS.CPM.CPT.CPC 是什么 网络营销之所以越来越受到重视一个主要的原因就是因为“精准”.相比较传统媒体的陈旧广告形式,网络营销能为广告主带来更为确切的效果与回报,更有传统媒体所没有 ...
- Android 日常开发总结的技术经验 60 条
1. 全部Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有效. 2. 数据库表段字段常量和SQL逻辑分离,更清 ...