简单的线程同步
一、线程池
线程池在多线程应用程序的初始化过程中创建线程的集合,当需要线程时,为新任务重用这些线程,而不是创建新的线程的过程。在这个过程中线程数量通常是固定的,这个数目取决于可用的内存和应用程序的需要,也可以增加线程数量。池的线程处理任务的过程是,当线程池中有线程空闲时分派的任务执行,当任务执行结束是线程被线程池回收(不是销毁),当有新的任务到来时,线程池再重用这些空闲可用的线程。
线程池常用用法如示例:
View Code
using System; using System.Collections.Generic; using System.Text; using System.Threading; namespace ThreadDemoCreateThead { class Program { static void Main(string[] args) { int maxWorkerThreadNums = 0; int maxIOThreadNums = 0; //获得默认的线程可用数目线程池中辅助线程和线程池中IO线程 ThreadPool.GetMaxThreads(out maxWorkerThreadNums, out maxIOThreadNums); Console.WriteLine("MaxWorkerThreadNums:"+maxWorkerThreadNums+" MaxIOThreadNums:"+maxIOThreadNums); //重新设置线程池中最大可用线程数目 ThreadPool.SetMaxThreads(200, 100); //获得默认的线程可用数目线程池中辅助线程和线程池中IO线程 ThreadPool.GetMaxThreads(out maxWorkerThreadNums, out maxIOThreadNums); Console.WriteLine("MaxWorkerThreadNums:" + maxWorkerThreadNums + " MaxIOThreadNums:" + maxIOThreadNums); ThreadPool.QueueUserWorkItem(new WaitCallback(WriteOper)); ThreadPool.GetAvailableThreads(out maxWorkerThreadNums, out maxIOThreadNums); Console.WriteLine("MaxUseAbleWorkerThreadNums:" + maxWorkerThreadNums + " MaxUseAbleIOThreadNums:" + maxIOThreadNums); ThreadPool.QueueUserWorkItem(new WaitCallback(WriteOperWithParamas), "param"); Console.ReadKey(); } static void WriteOper(object obj) { for (int i = 0; i < 2; i++) { Console.WriteLine("ThreadHash:"+Thread.CurrentThread.GetHashCode()+" Value:"+i); } } static void WriteOperWithParamas(object obj) { Console.WriteLine("ThreadHash:" + Thread.CurrentThread.GetHashCode() + " Value:" + obj); } } }
运行结果如下图:
线程池类ThreadPool类是静态类,所有方法是静态方法,可以直接调用,示例代码中使用了线程池最常用的几个方法。
二、计时器
计时器也很简单,计时器可以用来控制多长时间执行一次相关的任务。主要用到Timer类和TimerCallback委托。
示例全码如下:
View Code
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace TimerDemo { class Program { static void Main(string[] args) { Timer timer = new Timer(new TimerCallback(ExecuteMethod), 2, 100, 1000); Thread.Sleep(2000); Console.WriteLine("Change"); timer.Change(1000, 2000); Thread.Sleep(3000); timer.Dispose(); Console.ReadKey(); } static void ExecuteMethod(object obj) { int timer = 0; int.TryParse(obj.ToString(), out timer); for (int i = 0; i < timer; i++) { Console.WriteLine(timer); } } } }
结果如下图:
Timer类比较简单,只要明白4个构造函数的参数意义就会很方便的使用。