c#之线程池优先级
using System; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { ManualResetEvent rem = new ManualResetEvent(false); //设置信号灯为无状态 ThreadPool.SetMaxThreads(3, 3); thr t = new thr(15, rem); for (int i = 0; i < 15; i++) { ThreadPool.QueueUserWorkItem(new WaitCallback(t.met),i); } rem.WaitOne(Timeout.Infinite, true); Console.WriteLine("断点测试"); Thread.Sleep(10000); Console.WriteLine("运行结束"); Console.ReadKey(); } } public class thr { public thr(int count,ManualResetEvent res) { iMaxCount1 = count; evens = res; } public static int icount = 0; public static int iMaxCount1 = 0; public ManualResetEvent evens; public void met(object i) { Console.WriteLine("thgead[" + i.ToString() + "]"); Thread.Sleep(2000); //Interlocked.Increment()操作是一个原子操作,作用是:iCount++ 具体请看下面说明 //原子操作,就是不能被更高等级中断抢夺优先的操作。你既然提这个问题,我就说深一点。 //由于操作系统大部分时间处于开中断状态, //所以,一个程序在执行的时候可能被优先级更高的线程中断。 //而有些操作是不能被中断的,不然会出现无法还原的后果,这时候,这些操作就需要原子操作。 //就是不能被中断的操作。 Interlocked.Increment(ref icount); if (icount == iMaxCount1) { Console.WriteLine("发出结束信号!"); //将事件状态设置为终止状态,允许一个或多个等待线程继续。 evens.Set(); } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Diagnostics; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { ManualResetEvent rem = new ManualResetEvent(false); //设置信号灯为无状态 ThreadPool.SetMaxThreads(1, 3); for (int i = 0; i < 5; i++) { thr t = new thr(5, rem); ThreadPool.QueueUserWorkItem(new WaitCallback(t.met), i); } Console.WriteLine("断点测试"); Thread.Sleep(200000); Console.ReadKey(); } } public class thr { public thr(int count, ManualResetEvent res) { iMaxCount1 = count; evens = res; } public static int icount = 0; public static int iMaxCount1 = 0; public ManualResetEvent evens; public void met(object ss) { lock (this) { Thread.Sleep(30); Random r = new Random(); List<int> l = new List<int>(); for (int j = 0; j < 6; j++) { int lable = r.Next(1, 34); if (l.Contains(lable)) { j--; } else { l.Add(lable); } } l.Sort(); int lan = r.Next(1, 17); string zu = l[0].ToString() + " " + l[1].ToString() + " " + l[2].ToString() + " " + l[3].ToString() + " " + l[4].ToString() + " " + l[5].ToString() + "-" + lan; Console.WriteLine(zu); //Interlocked.Increment()操作是一个原子操作,作用是:iCount++ 具体请看下面说明 //原子操作,就是不能被更高等级中断抢夺优先的操作。你既然提这个问题,我就说深一点。 //由于操作系统大部分时间处于开中断状态, //所以,一个程序在执行的时候可能被优先级更高的线程中断。 //而有些操作是不能被中断的,不然会出现无法还原的后果,这时候,这些操作就需要原子操作。 //就是不能被中断的操作。 Interlocked.Increment(ref icount); if (icount == iMaxCount1) { Console.WriteLine("发出结束信号!"); //将事件状态设置为终止状态,允许一个或多个等待线程继续。 evens.Set(); } } } public void PlayGame(object ss) { } } }