class Program { static void Main(string[] args) { DateTime StartDt = System.DateTime.Now; QueListClass QueList1 = new QueListClass(); QueListClass QueList2 = new QueListClass(); //启动线程 QueList1.StartRun(); QueList2.StartRun(); for (int i = 1; i <= 300; i++) { if (QueList1.GetWaitQueCount() < QueList1.QueMaxCount) { QueList1.AddValue(i); } else if (QueList2.GetWaitQueCount() < QueList2.QueMaxCount) { QueList2.AddValue(i); } while (QueList1.GetWaitQueCount() == QueList1.QueMaxCount && QueList2.GetWaitQueCount() == QueList2.QueMaxCount) { Thread.Sleep(100); } } while (QueList1.GetWaitQueCount() >0 && QueList2.GetWaitQueCount()>0) { Thread.Sleep(100); } QueList1.StopRun(); QueList2.StopRun(); DateTime EndDt = System.DateTime.Now; System.Console.WriteLine("执行完毕!时间=" + (EndDt.Ticks - StartDt.Ticks).ToString()); System.Console.ReadLine(); } //多线程方法一 public void ConstComput() { //预设5 个线程 Thread Thread1 = null; Thread Thread2 = null; Thread Thread3 = null; //启动线程 for (int i = 1; i < 999999; i++) { if (Thread1 == null || Thread1.ThreadState == ThreadState.Stopped) { DifferComput dc = new DifferComput(); dc.i = i; Thread1 = new Thread(new ThreadStart(dc.Comput)); Thread1.Name = "线程1"; Thread1.Start(); } else if (Thread2 == null || Thread2.ThreadState == ThreadState.Stopped) { DifferComput dc = new DifferComput(); dc.i = i; Thread2 = new Thread(new ThreadStart(dc.Comput)); Thread2.Name = "线程2"; Thread2.Start(); } else if (Thread3 == null || Thread3.ThreadState == ThreadState.Stopped) { DifferComput dc = new DifferComput(); dc.i = i; Thread3 = new Thread(new ThreadStart(dc.Comput)); Thread3.Name = "线程3"; Thread3.Start(); } while (Thread1 != null && Thread1.ThreadState != ThreadState.Stopped && Thread2 != null && Thread2.ThreadState != ThreadState.Stopped && Thread3 != null && Thread3.ThreadState != ThreadState.Stopped) { Thread.Sleep(100); } } System.Console.WriteLine("执行完毕!"); System.Console.ReadLine(); } //多线程方法二 public void DynComput() { int ThreadCount = 10; while (ThreadCount > 0) { DateTime StartDt = System.DateTime.Now; //ThreadCount +=1; List<Thread> ThreadList = new List<Thread>(); for (int i = 0; i < ThreadCount; i++) { ThreadList.Add(null); } int AliveCount = 0; //启动线程 for (int i = 1; i <= 20; ) { for (int k = 0; k < ThreadList.Count; k++) { if (ThreadList[k] == null || ThreadList[k].ThreadState == ThreadState.Stopped) { DifferComput dc = new DifferComput(); dc.i = i; Thread tmpThread = new Thread(new ThreadStart(dc.Comput)); tmpThread.Name = "线程" + i; tmpThread.Start(); ThreadList[k] = tmpThread; i++; } } AliveCount = ThreadList.Count; while (ThreadList.Count == AliveCount) { AliveCount = 0; for (int k = 0; k < ThreadList.Count; k++) { if (ThreadList[k] != null && ThreadList[k].ThreadState != ThreadState.Stopped) { AliveCount += 1; } } Thread.Sleep(100); } } AliveCount = ThreadList.Count; while (AliveCount > 0) { AliveCount = 0; for (int k = 0; k < ThreadList.Count; k++) { if (ThreadList[k] != null && ThreadList[k].ThreadState != ThreadState.Stopped) { AliveCount += 1; } } Thread.Sleep(100); } DateTime EndDt = System.DateTime.Now; System.Console.WriteLine("执行完毕!时间=" + (EndDt.Ticks - StartDt.Ticks).ToString()); System.Console.ReadLine(); } } } //监听队列管理类 public class QueListClass { private List<int> QueList = new List<int>(); private object SynObj = new object(); public int QueMaxCount = 5; public bool IsRunning = false; public int GetWaitQueCount() { return QueList.Count; } private Thread thread = null; public void AddValue(int i) { lock (SynObj) { QueList.Add(i); } } public void RemoveValue(int i) { lock (SynObj) { QueList.Remove(i); } } public void StartRun() { ThreadStart ts = new ThreadStart(this.Loop); thread = new Thread(ts); thread.Start(); IsRunning = true; } public void StopRun() { if (thread != null) { while (QueList.Count > 0) { this.Execute(); } this.IsRunning = false; } thread = null; } public void Loop() { while (this.IsRunning==true) { this.Execute(); } } public void Execute() { if (QueList.Count > 0) { DifferComput dc = new DifferComput(); dc.i = QueList[QueList.Count - 1]; dc.Comput(); this.RemoveValue((int)dc.i); } else { Thread.Sleep(100); } } } public class DifferComput { public static object SynObj = new object(); public double i = 0; public double Result = 0; public void Comput() { Result = i * i*i/Math.Sqrt(i); //for (int q = 0; q < 888888; q++) for (int n = 0; n < 1000; n++) ; System.Console.WriteLine(i.ToString()+"^3/|2="+Result.ToString()); System.Diagnostics.Debug.WriteLine(i.ToString() + "^3=" + Result.ToString()); } }