110,538
社区成员
发帖
与我相关
我的任务
分享
public class Consumer<T>
{
private int m_Count = 0;
private Iterator<T>[] procHandlers;
public void Init(int iProcesserNum, Action<T> callBack)
{
procHandlers = new Iterator<T>[iProcesserNum];
for (int i = 0; i < iProcesserNum; i++)
{
procHandlers[i] = new Iterator<T>(callBack);
procHandlers[i].Name = i.ToString();
procHandlers[i].Start();
}
}
public void Stop()
{
if (procHandlers != null)
{
for (int i = 0; i < procHandlers.Length; i++)
{
procHandlers[i].Stop();
}
}
}
public void Enqueue(T t)
{
if (m_Count < 0) m_Count = 0;
int index = (int)(m_Count % procHandlers.Length);
procHandlers[index].Enqueue(t);
m_Count++;
}
private class Iterator<TE>
{
private AutoResetEvent m_Signal = new AutoResetEvent(false);
private Queue<TE> m_Queue = new Queue<TE>();
private Thread thread;
private Action<TE> m_CallBack;
private bool isRunning;
public string Name;
public Iterator(Action<TE> callBack)
{
m_CallBack = callBack;
}
public void Start()
{
if (thread == null)
{
isRunning = true;
thread = new Thread(new ThreadStart(SlicProc));
thread.Name = Name;
thread.IsBackground = true;
thread.Start();
}
}
public void Stop()
{
isRunning = false;
if (thread != null)
{
try
{
thread.Abort();
}
finally
{
}
}
thread = null;
}
public void SetSignal()
{
m_Signal.Set();
}
public void Enqueue(TE te)
{
lock (m_Queue)
{
m_Queue.Enqueue(te);
}
m_Signal.Set();
}
private TE Dequeue()
{
lock (m_Queue)
{
if (m_Queue.Count > 0)
{
return m_Queue.Dequeue();
}
}
return default(TE);
}
internal void SlicProc()
{
while (m_Signal.WaitOne())
{
while (m_Queue.Count > 0)
{
TE file = Dequeue();
if (file != null)
{
if (m_CallBack != null)
{
m_CallBack(file);
}
}
}
if (!isRunning)
{
break;
}
}
}
}
}
//调用DEMO
定义为静态
private static Consumer<实体参数> consumerProc = new Consumer<实体参数>();
consumerProc.Init(3, Proc);//初始化3个线程执行,Proc为处理方法
private static void Proc(实体参数 handler)
{
这里干话你平常怎么干就怎么干
}
下面这句放到你读取数据库的线程中读取后直接把你的实体参数放到这个里面,线程一有空闲就会接收并马上处理
consumerProc.Enqueue(实体参数);//
这是你想要的了,这里的线程是绝对平均的了,放到线程里的任务会自动平均分配到对应的线程里