多线程计算:ThreadPool:Set and Reset
2010-03-12 11:31
561 查看
using System;
using System.Threading;
class CalculateTest
{
static void Main()
{
Calculate calc = new Calculate();
Console.WriteLine("Result = {0}.",
calc.Result(55).ToString());
Console.WriteLine("Result = {0}.",
calc.Result(34).ToString());
Console.ReadKey();
}
}
class Calculate
{
double baseNumber, firstTerm, secondTerm, thirdTerm;
AutoResetEvent[] autoEvents;
ManualResetEvent manualEvent;
Random randomGenerator;
public Calculate()
{
autoEvents = new AutoResetEvent[]
{
new AutoResetEvent(false),
new AutoResetEvent(false),
new AutoResetEvent(false)
};
manualEvent = new ManualResetEvent(false);
}
void CalculateBase(object stateInfo)
{
baseNumber = randomGenerator.NextDouble();
manualEvent.Set();
}
void CalculateFirstTerm(object stateInfo)
{
double preCalc = randomGenerator.NextDouble();
manualEvent.WaitOne();
firstTerm = preCalc * baseNumber *
randomGenerator.NextDouble();
autoEvents[0].Set();
}
void CalculateSecondTerm(object stateInfo)
{
double preCalc = randomGenerator.NextDouble();
manualEvent.WaitOne();
secondTerm = preCalc * baseNumber *
randomGenerator.NextDouble();
autoEvents[1].Set();
}
void CalculateThirdTerm(object stateInfo)
{
double preCalc = randomGenerator.NextDouble();
manualEvent.WaitOne();
thirdTerm = preCalc * baseNumber *
randomGenerator.NextDouble();
autoEvents[2].Set();
}
public double Result(int seed)
{
randomGenerator = new Random(seed);
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalculateBase));
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalculateFirstTerm));
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalculateSecondTerm));
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalculateThirdTerm));
WaitHandle.WaitAll(autoEvents);
manualEvent.Reset();
return firstTerm + secondTerm + thirdTerm;
}
}
using System.Threading;
class CalculateTest
{
static void Main()
{
Calculate calc = new Calculate();
Console.WriteLine("Result = {0}.",
calc.Result(55).ToString());
Console.WriteLine("Result = {0}.",
calc.Result(34).ToString());
Console.ReadKey();
}
}
class Calculate
{
double baseNumber, firstTerm, secondTerm, thirdTerm;
AutoResetEvent[] autoEvents;
ManualResetEvent manualEvent;
Random randomGenerator;
public Calculate()
{
autoEvents = new AutoResetEvent[]
{
new AutoResetEvent(false),
new AutoResetEvent(false),
new AutoResetEvent(false)
};
manualEvent = new ManualResetEvent(false);
}
void CalculateBase(object stateInfo)
{
baseNumber = randomGenerator.NextDouble();
manualEvent.Set();
}
void CalculateFirstTerm(object stateInfo)
{
double preCalc = randomGenerator.NextDouble();
manualEvent.WaitOne();
firstTerm = preCalc * baseNumber *
randomGenerator.NextDouble();
autoEvents[0].Set();
}
void CalculateSecondTerm(object stateInfo)
{
double preCalc = randomGenerator.NextDouble();
manualEvent.WaitOne();
secondTerm = preCalc * baseNumber *
randomGenerator.NextDouble();
autoEvents[1].Set();
}
void CalculateThirdTerm(object stateInfo)
{
double preCalc = randomGenerator.NextDouble();
manualEvent.WaitOne();
thirdTerm = preCalc * baseNumber *
randomGenerator.NextDouble();
autoEvents[2].Set();
}
public double Result(int seed)
{
randomGenerator = new Random(seed);
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalculateBase));
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalculateFirstTerm));
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalculateSecondTerm));
ThreadPool.QueueUserWorkItem(
new WaitCallback(CalculateThirdTerm));
WaitHandle.WaitAll(autoEvents);
manualEvent.Reset();
return firstTerm + secondTerm + thirdTerm;
}
}
相关文章推荐
- 【Java多线程】之十二:Java Thread Pool Example using Executors and ThreadPoolExecutor
- 定时器与多线程 SetTimer and Multi-Thread 每个线程独立使用一个定时器
- JDK5.0 ThreadPool 多线程计算
- 定时器与多线程 SetTimer and Multi-Thread 每个线程独立使用一个定时器
- 多线程实现Thread.Start()与ThreadPool.QueueUserWorkItem两种方式对比
- ThreadPoolTaskExecutor 多线程分解执行耗时任务与单线程串行执行简单比较
- When should I create threads and when should I use thread pool to run work items asynchronously?
- [叩响C#之门]写给初学者:多线程系列( 十一)——线程池(ThreadPool)
- ThreadPoolTaskExecutor 多线程分解执行耗时任务与单线程串行执行简单比较
- DICOM:DICOM开源库多线程分析之“LF_ThreadPool in DCM4CHEE”
- Java多线程 -- JUC包源码分析15 -- SynchronousQueue与CachedThreadPool
- 使用THREAD_POOL.execute引发一次神奇的多线程问题
- .NET 异步多线程,Thread,ThreadPool,Task,Parallel
- C#多线程编程之线程池的使用 (ThreadPool)
- Thread variables and the .NET thread pool
- Whats the difference between Thread.setPriority() and android.os.Process.setThreadPriority()
- NET 异步多线程,THREAD,THREADPOOL,TASK,PARALLEL
- Thread Pool and Asynch I/O
- muduo 30 支持多线程 EventLoopThreadPool
- [多线程]thread,threadpool,task及TPL知识点整理