热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

多线程问题,有经验的朋友进来帮下忙啊,许许多多谢谢了

线程中有两个方法login();sendinfo();第一步:thread1-100运行一次login(),但不运行sendinfo()第二步:thread1-100各运行一次sendi
线程中有两个方法login(); sendinfo();
第一步:thread 1-100运行一次login(),但不运行sendinfo()
第二步:thread 1-100各运行一次sendinfo(),每个thread间隔100ms
重复第二步

这样做可行吗?

38 个解决方案

#1


空谈线程其实是很扯的。

如果一个方法中要做的事情完毕了,那么它就应该完毕了!就不要在此来纠缠什么线程问题(线程也就是释放了)。如果要间隔一段时间来执行某方法,那么就使用定时器就可以了。

不要胡乱用什么“线程”这个词儿。学学实际的异步调用方法、使用定时器的基本语法就行了。时髦词儿虚用得过头了(而不能写出简单直接的可操作代码),有时候还不如不知道这些词儿。

#2


你担心的是什么?只是运行,有什么不可以的?

#3


如果你的方法是
private void test()
{
    a();
    b();
    c();
}
这就是顺序执行。但是如果我们发现CPU利用率很低,而对a、b、c的内部机制的认识所知道,它们存在并发执行而提高cpu使用率(付出了线程调度的代价,但是提高了cpu的使用率)的可能性,那么我们就可能使用两个子线程来调用b和c方法,而不是顺序执行的。

线程就是这样的简单的概念,不要拿来搞各种噱头。如果你还觉得很神秘,那么就找一个有关操作系统的教材用大半年时间慢慢学习一下,那样就能有比较扎实而基础的相关知识。

#4


对于Timer来说,.net支持好几种。其中System.Threding.Timer类是最为简单的。而且它的回调就是在一个子线程中。例如你写
var tmr = new Timer(x =>
{
    响铃();
}, null, 100, 5000);

那么这就是从当前代码执行时间开始,100毫秒之后响铃一次,然后每隔5秒钟响铃一次。所有的响铃操作都是从系统线程池中临时分配(占用)空闲子线程去执行的(从而使用到windows操作系统的抢先式线程任务调度机制),而不是在当前的线程(例如UI线程)中执行的。

定时器,以及线程,本来是很简单的东西。不要把它们弄得很神秘。如果搞不明白线程的机制,就学学操作系统入门课程。

#5


额~牛又在天上飞了

#6


这个不是问过了么?

#7


抛开你为什么要这样做,以及你这样做合理不合理
然后 你的东西 肯定是可行

最方便的的是使用内置ManualResetEvent
static ManualResetEvent myResetEvent = new ManualResetEvent(false);
然后 在需要等待的地方myResetEvent .WaitOne();
触发结束等待调用myResetEvent .Set();

除此之外还有volatile 这些东西有兴趣也可以看下 

最后不知道你说的每个thread间隔100ms 是什么意思 ,个人感觉LZ是想做压力测试

#8


引用 3 楼 sp1234 的回复:
如果你的方法是
private void test()
{
    a();
    b();
    c();
}
这就是顺序执行。但是如果我们发现CPU利用率很低,而对a、b、c的内部机制的认识所知道,它们存在并发执行而提高cpu使用率(付出了线程调度的代价,但是提高了cpu的使用率)的可能性,那么我们就可能使用两个子线程来调用b和c方法,而不是顺序执行的。

线程就是这样的简单的概念,不要拿来搞各种噱头。如果你还觉得很神秘,那么就找一个有关操作系统的教材用大半年时间慢慢学习一下,那样就能有比较扎实而基础的相关知识。




login()用时500ms  sendinfo()用时1000ms,这两个方法都要花费那么长时间后才可以执行下面的代码,所以,你的办法显然是行不通的

#9


引用 7 楼 lulianqi 的回复:
抛开你为什么要这样做,以及你这样做合理不合理
然后 你的东西 肯定是可行

最方便的的是使用内置ManualResetEvent
static ManualResetEvent myResetEvent = new ManualResetEvent(false);
然后 在需要等待的地方myResetEvent .WaitOne();
触发结束等待调用myResetEvent .Set();

除此之外还有volatile 这些东西有兴趣也可以看下 

最后不知道你说的每个thread间隔100ms 是什么意思 ,个人感觉LZ是想做压力测试


login()用时500ms  sendinfo()用时1000ms,这两个方法都要花费那么长时间后才可以执行下面的代码,所以,你的办法显然是行不通的

#10


引用 9 楼 rbbcnm 的回复:
Quote: 引用 7 楼 lulianqi 的回复:

抛开你为什么要这样做,以及你这样做合理不合理
然后 你的东西 肯定是可行

最方便的的是使用内置ManualResetEvent
static ManualResetEvent myResetEvent = new ManualResetEvent(false);
然后 在需要等待的地方myResetEvent .WaitOne();
触发结束等待调用myResetEvent .Set();

除此 之外还有 volatile  这些东西有兴趣也可以看下 

最后不知道你说的每个thread间隔100ms 是什么意思 ,个人感觉LZ是想做压力测试


login()用时500ms  sendinfo()用时1000ms,这两个方法都要花费那么长时间后才可以执行下面的代码,所以,你的办法显然是行不通的

不好意思 没有完全看完lz的问题
lz的意思好像是要等100个线程都执行完一次sendinfo() 再让这100个线程再执行下一次 然后反复进行
如果是这样 其实也跟执行需要多少时间没关系,还是状态同步的问题
讲下我的方法  可能不是最好的不过满足需要
使用myAutoResetEvent (ManualResetEvent 的小伙伴)有多少线程就使用多少个myAutoResetEvent   myAutoResetEvent的WaitOne() 每次调用后都会自己锁上 
然后还需要一个检测线程 检查本轮100个sendinfo() 都已经完成。 会使用到共享数据  比如共享的 int  每次完成+1  到100就表示本轮完成    最好使用上面说 volatile 修饰,如果就是应付下最简单的static可以应付下
while
{
    myAutoResetEvent.WaitOne();
    sendinfo() ;
    通知检测线程
}


然后检查线程判定本轮100个完成   把100个myAutoResetEvent 全部set下  
你的100个线程就会收到通知  执行下一轮的sendinfo()

#11


引用 10 楼 lulianqi 的回复:
Quote: 引用 9 楼 rbbcnm 的回复:

Quote: 引用 7 楼 lulianqi 的回复:

抛开你为什么要这样做,以及你这样做合理不合理
然后 你的东西 肯定是可行

最方便的的是使用内置ManualResetEvent
static ManualResetEvent myResetEvent = new ManualResetEvent(false);
然后 在需要等待的地方myResetEvent .WaitOne();
触发结束等待调用myResetEvent .Set();

除此 之外还有 volatile  这些东西有兴趣也可以看下 

最后不知道你说的每个thread间隔100ms 是什么意思 ,个人感觉LZ是想做压力测试


login()用时500ms  sendinfo()用时1000ms,这两个方法都要花费那么长时间后才可以执行下面的代码,所以,你的办法显然是行不通的

不好意思 没有完全看完lz的问题
lz的意思好像是要等100个线程都执行完一次sendinfo() 再让这100个线程再执行下一次 然后反复进行
如果是这样 其实也跟执行需要多少时间没关系,还是状态同步的问题
讲下我的方法  可能不是最好的不过满足需要
使用myAutoResetEvent (ManualResetEvent 的小伙伴)有多少线程就使用多少个myAutoResetEvent   myAutoResetEvent的WaitOne() 每次调用后都会自己锁上 
然后还需要一个检测线程 检查本轮100个sendinfo() 都已经完成。 会使用到共享数据  比如共享的 int  每次完成+1  到100就表示本轮完成    最好使用上面说 volatile 修饰,如果就是应付下最简单的static可以应付下
while
{
    myAutoResetEvent.WaitOne();
    sendinfo() ;
    通知检测线程
}


然后检查线程判定本轮100个完成   把100个myAutoResetEvent 全部set下  
你的100个线程就会收到通知  执行下一轮的sendinfo()




还是不行啊,只要线程锁上的都不行,因为sendinfo()需要用时1000ms,而我想让两个线程之间间隔是50ms后,就是在这个线程的sendinfo()还没执行完的时就激活下一个线程

#12


你想解决什么问题呢?把你想调试的程序贴上来比较合适!

#13


引用 11 楼 rbbcnm 的回复:
Quote: 引用 10 楼 lulianqi 的回复:

Quote: 引用 9 楼 rbbcnm 的回复:

Quote: 引用 7 楼 lulianqi 的回复:

抛开你为什么要这样做,以及你这样做合理不合理
然后 你的东西 肯定是可行

最方便的的是使用内置ManualResetEvent
static ManualResetEvent myResetEvent = new ManualResetEvent(false);
然后 在需要等待的地方myResetEvent .WaitOne();
触发结束等待调用myResetEvent .Set();

除此 之外还有 volatile  这些东西有兴趣也可以看下 

最后不知道你说的每个thread间隔100ms 是什么意思 ,个人感觉LZ是想做压力测试


login()用时500ms  sendinfo()用时1000ms,这两个方法都要花费那么长时间后才可以执行下面的代码,所以,你的办法显然是行不通的

不好意思 没有完全看完lz的问题
lz的意思好像是要等100个线程都执行完一次sendinfo() 再让这100个线程再执行下一次 然后反复进行
如果是这样 其实也跟执行需要多少时间没关系,还是状态同步的问题
讲下我的方法  可能不是最好的不过满足需要
使用myAutoResetEvent (ManualResetEvent 的小伙伴)有多少线程就使用多少个myAutoResetEvent   myAutoResetEvent的WaitOne() 每次调用后都会自己锁上 
然后还需要一个检测线程 检查本轮100个sendinfo() 都已经完成。 会使用到共享数据  比如共享的 int  每次完成+1  到100就表示本轮完成    最好使用上面说 volatile 修饰,如果就是应付下最简单的static可以应付下
while
{
    myAutoResetEvent.WaitOne();
    sendinfo() ;
    通知检测线程
}


然后检查线程判定本轮100个完成   把100个myAutoResetEvent 全部set下  
你的100个线程就会收到通知  执行下一轮的sendinfo()




还是不行啊,只要线程锁上的都不行,因为sendinfo()需要用时1000ms,而我想让两个线程之间间隔是50ms后,就是在这个线程的sendinfo()还没执行完的时就激活下一个线程

那调整通知检测线程这个事情在sendinfo之前就可以了
while
{
    myAutoResetEvent.WaitOne();
   通知检测线程
    sendinfo() ;
}

通知检测线程  收到通知后等待50毫秒  为下一个myAutoResetEvent 进行set
循环为这100个线程依次set



#14


引用
那调整通知检测线程这个事情在sendinfo之前就可以了
while
{
    myAutoResetEvent.WaitOne();
   通知检测线程
    sendinfo() ;
}

通知检测线程  收到通知后等待50毫秒  为下一个myAutoResetEvent 进行set
循环为这100个线程依次set



还是不行啊,只要一设置为set,所有的waitone()状态的线程都在抢啊,所以这些线程还是同时执行了

#15


你想让100个线程轮流等待,那你就放100个变量进去比较好了
就用1个变量控制100个线程?你想多了

除非你不要求线程执行顺序,一个线程完了,其他所有线程就去抢,谁先抢到算谁的,其他的继续等

#16


而且SP1234在1楼就已经指出了你这里最大的问题
就是根本不从实际出发,滥用线程

你这是自寻烦恼

#17


本来一个人能干的活,你非要弄了100个人来干,还要让他们排队不能哄抢

这要做的工作多了,不是那么简单的.

#18



r=new manualrestevent(false);
thread t1=new thread(()=>go1());
thread t2=new thread(()=>go2());
t1.start();
t2.start();

void go1(){
int i=0;
while(i<10){
r.waitone();
thread.sleep(500);
r.set();
console.writeline("a");
}
}

void go2(){
int i=0;
while(i<10){
r.waitone();
thread.sleep(500);
r.set();
console.writeline("b");
}
}

#19


引用 16 楼 Z65443344 的回复:
而且SP1234在1楼就已经指出了你这里最大的问题
就是根本不从实际出发,滥用线程

你这是自寻烦恼


谢谢你的回帖,不过我们是理科生,不是文科生,别那么多说教,大家都是成年人了,我不会追求简单问题复杂化

#20


理科生应该更理性才对
别人指出你这里有问题,让你换个思路

你非要一条道跑到黑吗

你这个问题,不过是类似"报数"一样,隔1秒,数个数,一个人来干就足够了
你非要100个人排排队,每个人报一个数,这样有意义?

#21


你想让每个人排好队报数
那么必须让每个人知道前面的人是谁,只有当前面的人报数过了,自己才能报数

而不是把他们都蒙住眼睛,只要听到报数,自己就去抢

#22


引用 21 楼 Z65443344 的回复:
你想让每个人排好队报数
那么必须让每个人知道前面的人是谁,只有当前面的人报数过了,自己才能报数

而不是把他们都蒙住眼睛,只要听到报数,自己就去抢


别跑题好吗?说这些有什么意义?你连我的问题都不知道,就来数落一翻,难道能体现出你的高大了?
我都说了"login()用时500ms  sendinfo()用时1000ms,这两个方法都要花费那么长时间后才可以执行下面的代码",而我要求线程之间间隔50ms

#23



引用
还是不行啊,只要线程锁上的都不行,因为sendinfo()需要用时1000ms,而我想让两个线程之间间隔是50ms后,就是在这个线程的sendinfo()还没执行完的时就激活下一个线程

那调整通知检测线程这个事情在sendinfo之前就可以了
while
{
    myAutoResetEvent.WaitOne();
   通知检测线程
    sendinfo() ;
}

通知检测线程  收到通知后等待50毫秒  为下一个myAutoResetEvent 进行set
循环为这100个线程依次set











    private ManualResetEvent aa;
    private ManualResetEvent bb;
        DateTime n = DateTime.Now;

       //  static object locker=new object();
        // public static Boolean proceed = true;

       // public delegate void ParameterizedThreadStart(object obj);
        static  void Main()
        {
            Program p = new Program();
            p.aa = new ManualResetEvent(false);
            p.bb = new ManualResetEvent(false);
            Thread t1 = new Thread(() => p.go1());
            t1.Start();
            Thread t2 = new Thread(() => p.go2());
            t2.Start();

            p.bb.Set();
            Thread.Sleep(500);
            p.aa.Set();
            Console.ReadLine();

        }

        public void go1()
        {
            aa.WaitOne();
            Console.WriteLine("aaa");
            Thread.Sleep(1);
            aa.WaitOne();
            Console.WriteLine("aaa");
            aa.WaitOne();
            Console.WriteLine("aaa");
            aa.WaitOne();
            Console.WriteLine("aaa");
            aa.WaitOne();
            Console.WriteLine("aaa");
        }
        public void go2()
        {
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
        }


为什么5个aaa同时输出?5个bbb也是同时输出的

#24


你完全可以用异步方式执行login()和sendinfo()
而不用关心到底是哪个线程在执行它

你所谓的开100个线程执行login(),我猜就是因为你有100个设备需要连接
那么你建100个socket对象就足够了,而完全用不着开100个线程

#25


像你这种,完全不理会需求,就从半个设计出发要求完全实现效果
真的是很扯淡的一件事

#26


引用 22 楼 rbbcnm 的回复:
Quote: 引用 21 楼 Z65443344 的回复:

你想让每个人排好队报数
那么必须让每个人知道前面的人是谁,只有当前面的人报数过了,自己才能报数

而不是把他们都蒙住眼睛,只要听到报数,自己就去抢


别跑题好吗?说这些有什么意义? 你连我的问题都不知道,就来数落一翻,难道能体现出你的高大了?
我都说了"login()用时500ms  sendinfo()用时1000ms,这两个方法都要花费那么长时间后才可以执行下面的代码",而我要求线程之间间隔50ms

首先,是你自己根本不肯说出真正的需求,而只说自己拍脑袋瞎想出来的所谓方案,那么我就没法给出任何实际的建议,而只能说你目前的方案真的很扯淡
其次,所谓数落,就是别人说你不好,就叫数落吗?
那么反过来,我说你很好,完全没有问题,什么都不需要改,这样就很开心是不是?这样能解决问题吗
你到底是想解决问题还是想求表扬??

#27


引用 26 楼 Z65443344 的回复:
Quote: 引用 22 楼 rbbcnm 的回复:

Quote: 引用 21 楼 Z65443344 的回复:

你想让每个人排好队报数
那么必须让每个人知道前面的人是谁,只有当前面的人报数过了,自己才能报数

而不是把他们都蒙住眼睛,只要听到报数,自己就去抢


别跑题好吗?说这些有什么意义? 你连我的问题都不知道,就来数落一翻,难道能体现出你的高大了?
我都说了"login()用时500ms  sendinfo()用时1000ms,这两个方法都要花费那么长时间后才可以执行下面的代码",而我要求线程之间间隔50ms

首先,是你自己根本不肯说出真正的需求,而只说自己拍脑袋瞎想出来的所谓方案,那么我就没法给出任何实际的建议,而只能说你目前的方案真的很扯淡
其次,所谓数落,就是别人说你不好,就叫数落吗?
那么反过来,我说你很好,完全没有问题,什么都不需要改,这样就很开心是不是?这样能解决问题吗
你到底是想解决问题还是想求表扬??


sendinfo1() sendinfo2() sendinfo3()…… sendinfo100() 

用异步如何间隔50毫秒启动这100个函数呢?

#28


你可以在主线程里用timer,然后每隔50ms就按顺序把这些函数丢入线程池里

或者看看sendinfo里到底用的什么方式通信,如果是socket,它本身就支持异步发送,异步接收
你修改里面的发送方式为异步发送,那么你直接顺序循环调用它们就行了

#29


引用 28 楼 Z65443344 的回复:
你可以在主线程里用timer,然后每隔50ms就按顺序把这些函数丢入线程池里

或者看看sendinfo里到底用的什么方式通信,如果是socket,它本身就支持异步发送,异步接收
你修改里面的发送方式为异步发送,那么你直接顺序循环调用它们就行了


login(); sendinfo();是调用dll中的函数,而且dll无法更改

#30


引用 28 楼 Z65443344 的回复:
你可以在主线程里用timer,然后每隔50ms就按顺序把这些函数丢入线程池里

或者看看sendinfo里到底用的什么方式通信,如果是socket,它本身就支持异步发送,异步接收
你修改里面的发送方式为异步发送,那么你直接顺序循环调用它们就行了



不是仍然要用到线程的吗?每个线程中有两个方法 login()和sendinfo(),其中login只执行一次!!

#31


引用 23 楼 rbbcnm 的回复:
引用
还是不行啊,只要线程锁上的都不行,因为sendinfo()需要用时1000ms,而我想让两个线程之间间隔是50ms后,就是在这个线程的sendinfo()还没执行完的时就激活下一个线程

那调整通知检测线程这个事情在sendinfo之前就可以了
while
{
    myAutoResetEvent.WaitOne();
   通知检测线程
    sendinfo() ;
}

通知检测线程  收到通知后等待50毫秒  为下一个myAutoResetEvent 进行set
循环为这100个线程依次set








    private ManualResetEvent aa;
    private ManualResetEvent bb;
        DateTime n = DateTime.Now;

       //  static object locker=new object();
        // public static Boolean proceed = true;

       // public delegate void ParameterizedThreadStart(object obj);
        static  void Main()
        {
            Program p = new Program();
            p.aa = new ManualResetEvent(false);
            p.bb = new ManualResetEvent(false);
            Thread t1 = new Thread(() => p.go1());
            t1.Start();
            Thread t2 = new Thread(() => p.go2());
            t2.Start();

            p.bb.Set();
            Thread.Sleep(500);
            p.aa.Set();
            Console.ReadLine();

        }

        public void go1()
        {
            aa.WaitOne();
            Console.WriteLine("aaa");
            Thread.Sleep(1);
            aa.WaitOne();
            Console.WriteLine("aaa");
            aa.WaitOne();
            Console.WriteLine("aaa");
            aa.WaitOne();
            Console.WriteLine("aaa");
            aa.WaitOne();
            Console.WriteLine("aaa");
        }
        public void go2()
        {
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
        }


为什么5个aaa同时输出?5个bbb也是同时输出的
5个b 又没有sleep 当然一起啊。
Thread.Sleep(1); 你这个是不是想写1000
不然1有什么sleep的用

#32


当然,没人说你不应该用线程
只是说你不应该用100个线程

不要走极端啊

#33


你出门带了100个钥匙
别人告诉你带100个没必要 ,带1个就够了

你就问人家,那不是还得带钥匙吗,有什么区别

你自己想想有啥区别

#34


引用 23 楼 rbbcnm 的回复:
引用
还是不行啊,只要线程锁上的都不行,因为sendinfo()需要用时1000ms,而我想让两个线程之间间隔是50ms后,就是在这个线程的sendinfo()还没执行完的时就激活下一个线程

那调整通知检测线程这个事情在sendinfo之前就可以了
while
{
    myAutoResetEvent.WaitOne();
   通知检测线程
    sendinfo() ;
}

通知检测线程  收到通知后等待50毫秒  为下一个myAutoResetEvent 进行set
循环为这100个线程依次set








    private ManualResetEvent aa;
    private ManualResetEvent bb;
        DateTime n = DateTime.Now;

       //  static object locker=new object();
        // public static Boolean proceed = true;

       // public delegate void ParameterizedThreadStart(object obj);
        static  void Main()
        {
            Program p = new Program();
            p.aa = new ManualResetEvent(false);
            p.bb = new ManualResetEvent(false);
            Thread t1 = new Thread(() => p.go1());
            t1.Start();
            Thread t2 = new Thread(() => p.go2());
            t2.Start();

            p.bb.Set();
            Thread.Sleep(500);
            p.aa.Set();
            Console.ReadLine();

        }

        public void go1()
        {
            aa.WaitOne();
            Console.WriteLine("aaa");
            Thread.Sleep(1);
            aa.WaitOne();
            Console.WriteLine("aaa");
            aa.WaitOne();
            Console.WriteLine("aaa");
            aa.WaitOne();
            Console.WriteLine("aaa");
            aa.WaitOne();
            Console.WriteLine("aaa");
        }
        public void go2()
        {
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
        }


为什么5个aaa同时输出?5个bbb也是同时输出的

lz 没有看仔细我的回复  后面让你用AutoResetEvent   不是  ManualResetEvent    2者全部我也提到了AutoResetEvent  是会WaitOne后就自己上锁的,你用ManualResetEvent  ,当然会全部开。  你用AutoResetEvent   再试一下

#35


引用 31 楼 wish907 的回复:
Quote: 引用 23 楼 rbbcnm 的回复:


引用
还是不行啊,只要线程锁上的都不行,因为sendinfo()需要用时1000ms,而我想让两个线程之间间隔是50ms后,就是在这个线程的sendinfo()还没执行完的时就激活下一个线程

那调整通知检测线程这个事情在sendinfo之前就可以了
while
{
    myAutoResetEvent.WaitOne();
   通知检测线程
    sendinfo() ;
}

通知检测线程  收到通知后等待50毫秒  为下一个myAutoResetEvent 进行set
循环为这100个线程依次set








    private ManualResetEvent aa;
    private ManualResetEvent bb;
        DateTime n = DateTime.Now;

       //  static object locker=new object();
        // public static Boolean proceed = true;

       // public delegate void ParameterizedThreadStart(object obj);
        static  void Main()
        {
            Program p = new Program();
            p.aa = new ManualResetEvent(false);
            p.bb = new ManualResetEvent(false);
            Thread t1 = new Thread(() => p.go1());
            t1.Start();
            Thread t2 = new Thread(() => p.go2());
            t2.Start();

            p.bb.Set();
            Thread.Sleep(500);
            p.aa.Set();
            Console.ReadLine();

        }

        public void go1()
        {
            aa.WaitOne();
            Console.WriteLine("aaa");
            Thread.Sleep(1);
            aa.WaitOne();
            Console.WriteLine("aaa");
            aa.WaitOne();
            Console.WriteLine("aaa");
            aa.WaitOne();
            Console.WriteLine("aaa");
            aa.WaitOne();
            Console.WriteLine("aaa");
        }
        public void go2()
        {
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
        }


为什么5个aaa同时输出?5个bbb也是同时输出的

5个b 又没有sleep 当然一起啊。
Thread.Sleep(1); 你这个是不是想写1000
不然1有什么sleep的用

Thread.Sleep(1);
aa.WaitOne();

我只用了一次set,但是输出了5个aaa,后面有aa.WaitOne();啊,但是这里的就不起作用了,这个方法还是行不通啊

#36


引用 34 楼 lulianqi 的回复:
Quote: 引用 23 楼 rbbcnm 的回复:


引用
还是不行啊,只要线程锁上的都不行,因为sendinfo()需要用时1000ms,而我想让两个线程之间间隔是50ms后,就是在这个线程的sendinfo()还没执行完的时就激活下一个线程

那调整通知检测线程这个事情在sendinfo之前就可以了
while
{
    myAutoResetEvent.WaitOne();
   通知检测线程
    sendinfo() ;
}

通知检测线程  收到通知后等待50毫秒  为下一个myAutoResetEvent 进行set
循环为这100个线程依次set








    private ManualResetEvent aa;
    private ManualResetEvent bb;
        DateTime n = DateTime.Now;

       //  static object locker=new object();
        // public static Boolean proceed = true;

       // public delegate void ParameterizedThreadStart(object obj);
        static  void Main()
        {
            Program p = new Program();
            p.aa = new ManualResetEvent(false);
            p.bb = new ManualResetEvent(false);
            Thread t1 = new Thread(() => p.go1());
            t1.Start();
            Thread t2 = new Thread(() => p.go2());
            t2.Start();

            p.bb.Set();
            Thread.Sleep(500);
            p.aa.Set();
            Console.ReadLine();

        }

        public void go1()
        {
            aa.WaitOne();
            Console.WriteLine("aaa");
            Thread.Sleep(1);
            aa.WaitOne();
            Console.WriteLine("aaa");
            aa.WaitOne();
            Console.WriteLine("aaa");
            aa.WaitOne();
            Console.WriteLine("aaa");
            aa.WaitOne();
            Console.WriteLine("aaa");
        }
        public void go2()
        {
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
            bb.WaitOne();
            Console.WriteLine("bbb");
        }


为什么5个aaa同时输出?5个bbb也是同时输出的


lz 没有看仔细我的回复  后面让你用AutoResetEvent   不是  ManualResetEvent    2者全部我也提到了AutoResetEvent  是会WaitOne后就自己上锁的,你用ManualResetEvent  ,当然会全部开。  你用AutoResetEvent   再试一下


AutoResetEvent 也是个类啊?我应该会了,谢谢你啊

我刚学c#,异步是不是不用学啊,因为我看的在线手册的目录里都没异步

再一次感谢你

#37


引用 33 楼 Z65443344 的回复:
你出门带了100个钥匙
别人告诉你带100个没必要 ,带1个就够了

你就问人家,那不是还得带钥匙吗,有什么区别

你自己想想有啥区别



谢谢你关注我的帖子,不过我再跟你说一次,我是成年人,不需要别人给我讲道理,autoresetevent 就能搞定的事,你blahblah讲一堆没用的,真的体现不出你的高大,其实没不知道或不熟悉 autoresetevent 

这么看来,简单问题复杂化的到底是你还是我呢??

#38


是不是要做个压力测试客户端?可以做到的

推荐阅读
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • HashMap的相关问题及其底层数据结构和操作流程
    本文介绍了关于HashMap的相关问题,包括其底层数据结构、JDK1.7和JDK1.8的差异、红黑树的使用、扩容和树化的条件、退化为链表的情况、索引的计算方法、hashcode和hash()方法的作用、数组容量的选择、Put方法的流程以及并发问题下的操作。文章还提到了扩容死链和数据错乱的问题,并探讨了key的设计要求。对于对Java面试中的HashMap问题感兴趣的读者,本文将为您提供一些有用的技术和经验。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 代理模式的详细介绍及应用场景
    代理模式是一种在软件开发中常用的设计模式,通过在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象进行访问,从而简化系统的复杂性。代理模式可以根据不同的使用目的分为远程代理、虚拟代理、Copy-on-Write代理、保护代理、防火墙代理、智能引用代理和Cache代理等几种。本文将详细介绍代理模式的原理和应用场景。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 深入理解线程、进程、多线程、线程池
    本文以QT的方式来走进线程池的应用、线程、进程、线程池、线程锁、互斥量、信号量、线程同步等的详解,一文让你小白变大神!为什么要使用多线程、线程锁、互斥量、信号量?为什么需要线程 ... [详细]
  • 第七课主要内容:多进程多线程FIFO,LIFO,优先队列线程局部变量进程与线程的选择线程池异步IO概念及twisted案例股票数据抓取 ... [详细]
  • Java编程思想一书中第21章并发中关于线程间协作的一节中有个关于汽车打蜡与抛光的小例子(原书的704页)。这个例子主要展示的是两个线程如何通过wait ... [详细]
author-avatar
love乄鮰
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有