开启多线程的四种方式

Thread类

1.TreadStart方法,无入参

            int arg1 = 10;
            string arg2 = "argument temp";
            Thread t1 = new Thread(new ThreadStart(
                 delegate
                 {
                     Console.WriteLine(arg1.ToString() + arg2);
                 }
                ));
            t1.Start();
            Console.ReadLine();

2.ParamerThreadStart方法,有入参

​ class Program
    {
        static void Main(string[] args)
        {
             Program p = new Program();
            Thread thread = new Thread(p.MyParameterRun);
            thread.Name = "线程A";
            MyThreadParameter parameter = new MyThreadParameter(1000, 20);
            thread.Start(parameter);
        }

        public void MyParameterRun(object ms) {
            MyThreadParameter parameter = ms as MyThreadParameter;
            if (parameter!=null)
            {
                for (int i = 0; i < parameter.LookCount; i++)
                {
                    Console.WriteLine(Thread.CurrentThread.Name+"系统当前时间毫秒值:"+DateTime.Now.Millisecond.ToString());
                    Thread.Sleep(parameter.Interval);
                }
                Console.ReadLine();
            }
        }
    }



    public class MyThreadParameter
    {
      
        public int LookCount
        { get; set; }

        public int Interval
        { get; set; }
        public MyThreadParameter(int interval,int lookCount)
        {
            this.Interval = interval;
            this.LookCount = lookCount;
        }
    }



​

控制台显示结果如下:

开启多线程的四种方式_第1张图片

 

线程池

    class Program
    {
        static void Main(string[] args)
        {

            //线程池 QueueUserWorkItem将方法排入队列以便执行,并指定包含该方法所用数据的对象。此方法在有线程池线程变得可用时执行。
            //GetMaxThreads检索可以同时处于活动状态的线程池请求的数目。所有大于此数目的请求将保持排队状态,直到线程池线程变为可用。

            // 线程池可以看做容纳线程的容器;一个应用程序最多只能有一个线程池;ThreadPool静态类通过QueueUserWorkItem()方法将工作函数排入线程池; 每排入一个工作函数,就相当于请求创建一个线程;
            //线程池的作用:
            //1、线程池是为突然大量爆发的线程设计的,通过有限的几个固定线程为大量的操作服务,减少了创建和销毁线程所需的时间,从而提高效率。
            //2、如果一个线程的时间非常长,就没必要用线程池了(不是不能作长时间操作,而是不宜。),况且我们还不能控制线程池中线程的开始、挂起、和中止
            ThreadPool.QueueUserWorkItem(new WaitCallback(TestThreadPool), new string[] { "hjh" });
      }

        public static void TestThreadPool(object state) {
            string[] array = state as string[];
            int workerThreads = 0;
            int CompletionPortThreads = 0;
            ThreadPool.GetMaxThreads(out workerThreads, out CompletionPortThreads);
            Console.WriteLine(DateTime.Now.ToString() + "---" + array[0] + "--workerThreads=" + workerThreads + "--CompletionPortThreads" + CompletionPortThreads);
        }
   }


控制台显示结果如下:

开启多线程的四种方式_第2张图片

Task

    class Program
    {
        static void Main(string[] args)
        {
            Task task = new Task(TestThreadPool);
            task.Start();
            Console.ReadLine();
        }

         public static void TestThreadPool() {
            int workerThreads = 0;
            int CompletionPortThreads = 0;
            ThreadPool.GetMaxThreads(out workerThreads, out CompletionPortThreads);
            Console.WriteLine(DateTime.Now.ToString() +"--workerThreads=" + workerThreads + "--CompletionPortThreads" + CompletionPortThreads);
        }
    }

控制台显示结果如下:

开启多线程的四种方式_第3张图片

委托.BeginInvoke

  class Program
    {
        static void Main(string[] args)
        {
            //委托.BeginInvoke
            Action a = add;
            a.BeginInvoke(3, 4, null, null);
            Console.WriteLine("执行线程");
            Console.ReadLine();
         }

          static void add(int a,int b) {
            Console.WriteLine("a+b=" + (a + b));
        }
    }

运行结果如下:

开启多线程的四种方式_第4张图片

 

你可能感兴趣的:(c#)