标题:多线程中调用静态方法的问题.
取消只看楼主
changjie
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2006-4-18
结帖率:100%
 问题点数:0 回复次数:1 
多线程中调用静态方法的问题.

class MessageCenter
{
static UserCollection Users=new UserCollection()
static DataTime _his;

public static MessageProcessor(ClientContent content)
{

if(DataTime.now>=_his.addMM(2)) // 问题1??
{
_his=DataTime.now;

//在这里做整理用户集合的事情.
}

switch(content.head)
{
case "onli":
break;
case "ofli":
break;

}
}
}


这个静态方法会被很多线程调用。

比如:
Thread t1=new Thread(new ThreadStart(work))
Thread t2=new Thread(new ThreadStart(work))
Thread t3=new Thread(new ThreadStart(work))
..... 等会很多。
void work()
{
while(true)
{
ClientContent c=new ClientContent()
MessageCenter.MessageProcessor(c) //A

Thread.sleep(2000);

}
}

这里模防每个线程会5秒钟调用//A这静太方法。

问题1?
目的:
不管是谁在调用这个静太方法,当他发现,现在的时间_his大于2分钟后,
就在自己的线程内,维护这个用户队列,也就是整理一次Users,其他都不用了。

我上面的方法显然是不行的,可能会发生几个线程同时进入,都去做这个维护工作
经过测试的确如此。
我断定问题是发生在这句子if(DataTime.now>=_his.addMM(2)) 当一个线程得到真结果后
还没有 _his=DataTime.now; 重新设置这个值。
另外一个线程己经也得到了if(DataTime.now>=_his.addMM(2))的true结果。


代码改进
class MessageCenter
{
static UserCollection Users=new UserCollection()
static DataTime _his;
static object lo=new object();

public static MessageProcessor(ClientContent content)
{

lock(lo)
{
if(DataTime.now>=_his.addMM(2)) // 问题1??
{
_his=DataTime.now;

//在这里做整理用户集合的事情.
}
}

switch(content.head)
{
case "onli":
break;
case "ofli":
break;

}
}
}

现求更高效的做法。

搜索更多相关主题的帖子: 线程 静态 
2007-10-09 19:18
changjie
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2006-4-18
得分:0 

这里只是用来描述这个问题,不是实际运行的代码.

目的:
不管是谁在调用这个静太方法,当他发现,现在的时间 比_his大2分钟后,
就在自己的线程内,维护这个用户队列,也就是整理一次Users,其他都不用了。

这才是目的

2007-10-10 10:35



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-176208-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.136488 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved