zoukankan      html  css  js  c++  java
  • 多线程编程(3)

    传递参数

    public class Demo2
    {
        private Thread thread2;
        private Thread thread1;
        public Demo2()
        {
            thread1 = new Thread(new ParameterizedThreadStart(Task1));
            thread1.Start("张三");
            thread2 = new Thread(new ParameterizedThreadStart(Task1));
            thread2.Start("李四");
        }
    
        public void Task1(object name)
        {
            Console.WriteLine(string.Format("{0} do this work",name));
        }
    }

    线程管理(线程池)

    如果有100个任务,则创建100个线程,如

    for (int i = 0; i < 100; i++)
    {
        var thread = new Thread(Task1);
        thread.Start("people"+i);
    }

    任务有轻重之分,一个任务完成后可以继续做其他事情,而不必要创建多余的线程.

    线程池内部提供了管理线程的机制,在大部分情况下使我们不必去担心线程管理的问题,其会根据需要自动分配线程,如下示例

    public Demo2()
    {
        for (int i = 0; i < 100; i++)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(Task1), "people" + i);
        }
        Console.Read();
    }

    注意点:线程将在后台执行,如果主线程结束退出的话,那么后台线程将无法继续执行,如去掉下面代码

    Console.Read()
    

    线程池的线程等价于将Thread的IsBackground属性设置为True,如

    hread1 = new Thread(new ParameterizedThreadStart(Task1));
    thread1.IsBackground = true;
    thread1.Start("张三");

    验证差别

    1.非线程池

    public Demo2()
    {
        for (int i = 0; i < 100; i++)
        {
            thread1 = new Thread(new ParameterizedThreadStart(Task1));
            thread1.IsBackground = true;
            thread1.Start("people" + i);
            
        }
        Console.Read();
    }
    
    public void Task1(object name)
    {
        Console.WriteLine(string.Format("Is Pool:{0},Thread Id {1},{2} do this work",
            Thread.CurrentThread.IsThreadPoolThread,
            Thread.CurrentThread.ManagedThreadId, name));
    }

    结果,都在非线程池托管,每个ThreadId都不同

    image

    2.使用线程池

    image

    可以看到Thread Id很多是重复的,所以用线程池是可以提升性能的.甚至你可以打开任务管理器可以看到使用了线程池的程序,同样的结果比使用创建100个线程内存使用上也少很多.

    线程池的容量

    ThreadPool提供了一些方法获取线程的数量及设置最小和最大线程数量,但最好还是保持系统默认值吧,不要去动。使用最多的将还是QueueUserWorkItem方法

  • 相关阅读:
    java和.NET的比较
    联想笔记本不能无线上网
    js根据给定的日期计算当月有多少天
    jQuery中live()变更
    C#操作xml文件
    SQL server的with的用法(一)
    jquery拖拽实现UI设计组件
    自定义弹出框
    第一个超级简单Node.js实例
    windows 下使用redis
  • 原文地址:https://www.cnblogs.com/Clingingboy/p/1878598.html
Copyright © 2011-2022 走看看