简单的线程同步

一、线程池

  线程池在多线程应用程序的初始化过程中创建线程的集合,当需要线程时,为新任务重用这些线程,而不是创建新的线程的过程。在这个过程中线程数量通常是固定的,这个数目取决于可用的内存和应用程序的需要,也可以增加线程数量。池的线程处理任务的过程是,当线程池中有线程空闲时分派的任务执行,当任务执行结束是线程被线程池回收(不是销毁),当有新的任务到来时,线程池再重用这些空闲可用的线程。

  线程池常用用法如示例:  

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个构造函数的参数意义就会很方便的使用。

posted @ 2013-03-12 22:48  mopheify  阅读(154)  评论(0编辑  收藏  举报