private void test()这就是顺序执行。但是如果我们发现CPU利用率很低,而对a、b、c的内部机制的认识所知道,它们存在并发执行而提高cpu使用率(付出了线程调度的代价,但是提高了cpu的使用率)的可能性,那么我们就可能使用两个子线程来调用b和c方法,而不是顺序执行的。
{
a();
b();
c();
}
var tmr = new Timer(x =>
{
响铃();
}, null, 100, 5000);
抛开你为什么要这样做,以及你这样做合理不合理
然后 你的东西 肯定是可行
最方便的的是使用内置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()
抛开你为什么要这样做,以及你这样做合理不合理
然后 你的东西 肯定是可行
最方便的的是使用内置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
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");
}
}
而且SP1234在1楼就已经指出了你这里最大的问题
就是根本不从实际出发,滥用线程
你这是自寻烦恼
你想让每个人排好队报数
那么必须让每个人知道前面的人是谁,只有当前面的人报数过了,自己才能报数
而不是把他们都蒙住眼睛,只要听到报数,自己就去抢
还是不行啊,只要线程锁上的都不行,因为sendinfo()需要用时1000ms,而我想让两个线程之间间隔是50ms后,就是在这个线程的sendinfo()还没执行完的时就激活下一个线程
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");
}
你想让每个人排好队报数
那么必须让每个人知道前面的人是谁,只有当前面的人报数过了,自己才能报数
而不是把他们都蒙住眼睛,只要听到报数,自己就去抢
别跑题好吗?说这些有什么意义? 你连我的问题都不知道,就来数落一翻,难道能体现出你的高大了?
我都说了"login()用时500ms sendinfo()用时1000ms,这两个方法都要花费那么长时间后才可以执行下面的代码",而我要求线程之间间隔50ms
你想让每个人排好队报数
那么必须让每个人知道前面的人是谁,只有当前面的人报数过了,自己才能报数
而不是把他们都蒙住眼睛,只要听到报数,自己就去抢
别跑题好吗?说这些有什么意义? 你连我的问题都不知道,就来数落一翻,难道能体现出你的高大了?
我都说了"login()用时500ms sendinfo()用时1000ms,这两个方法都要花费那么长时间后才可以执行下面的代码",而我要求线程之间间隔50ms
首先,是你自己根本不肯说出真正的需求,而只说自己拍脑袋瞎想出来的所谓方案,那么我就没法给出任何实际的建议,而只能说你目前的方案真的很扯淡
其次,所谓数落,就是别人说你不好,就叫数落吗?
那么反过来,我说你很好,完全没有问题,什么都不需要改,这样就很开心是不是?这样能解决问题吗
你到底是想解决问题还是想求表扬??
你可以在主线程里用timer,然后每隔50ms就按顺序把这些函数丢入线程池里
或者看看sendinfo里到底用的什么方式通信,如果是socket,它本身就支持异步发送,异步接收
你修改里面的发送方式为异步发送,那么你直接顺序循环调用它们就行了
你可以在主线程里用timer,然后每隔50ms就按顺序把这些函数丢入线程池里
或者看看sendinfo里到底用的什么方式通信,如果是socket,它本身就支持异步发送,异步接收
你修改里面的发送方式为异步发送,那么你直接顺序循环调用它们就行了
还是不行啊,只要线程锁上的都不行,因为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");
}
还是不行啊,只要线程锁上的都不行,因为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");
}
还是不行啊,只要线程锁上的都不行,因为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也是同时输出的
还是不行啊,只要线程锁上的都不行,因为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也是同时输出的
你出门带了100个钥匙
别人告诉你带100个没必要 ,带1个就够了
你就问人家,那不是还得带钥匙吗,有什么区别
你自己想想有啥区别