zoukankan      html  css  js  c++  java
  • 多线程(Thread),其实很简单!

    目录:

         1:线程简介

          2:怎么操作线程

          4:简单的获奖机

        5:应用程序域

     
    线程是Windows任务调度的最小单位。线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
    作用:
       让计算机"同时"做多件事情,节约时间。

      多线程可以让一个程序“同时”处理多个事情。

      后台运行程序,提高程序的运行效率,也不会使主界面出现无响应的情况

     
    解决问题:进程是一个资源的拥有者,因而在进程的创建、撤销、和切换的过程中,系统必须为之付出较大的时空开销,限制了并发程度的进一步提高
     
    怎么操作线程?

     创建线程:

    1:初始化

    Thread thread = new Thread(ThreadWorkFun);//ThreadWorkFun是一个委托

    2:

      new Thread(() =>
                    {
                    Console.WriteLine("ok");
                     }
                    ).start();

    开启线程:

     thread.Start();

    一个具体的例子:

            //任何代码都执行在线程中的,当前main方法执行在主线程中,(也就是默认线程)
            static void Main(string[] args)
            {
                //创建一个线程,执行当然线程的执行入口ThreadWork
                Thread thread = new Thread(ThreadWork);
                thread.Start();//告诉线程你可以调度我了
                Console.WriteLine("==============结束");
                Console.ReadKey();
            }
            static void ThreadWork()
            {
                for (int i = 0; i < 10; i++)
                {
                    Console.WriteLine(i);
                }
            }
         

    结果:结果不确定,ThreadWorkFun什么时候执行,由操作系统决定,

    注意:当线程指向的方法体执行完成的时候就自动销毁了

    Thread的常用属性和方法

       Abort():在调用此方法的线程上引发 ThreadAbortException终止线程--尽量少用,因为会抛出异常,如果抛异常会极大影响效率。

        GetDomain():返回当前线程正在其中运行的当前域。

       Priority:设置线程的优先级   thread.Priority = ThreadPriority.Highest;
            ManagedThreadId:  int num= thread.ManagedThreadId;//线程的编号,可以用于区分不同的线程
            CurrentThread.Name :获得当前线程的名字

           Join:线程等待             

     thread.join();//哪个线程执行当前代码的线程等待这个线程执行完成

      IsBackground:获取或设置一个值,该值指示某个线程是否为后台线程,值默认是false:前台线程:只有所有的前台线程都关闭才能完成程序关闭。后台线程:只要所有的前台线程结束,后台线程自动结束

     

     多线程实现的摇奖机

     

    namespace 摇奖器
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                InitLabel();
                InitName();
    
            }
            public Label label = new Label();
            public Dictionary<int, string> Dic = new Dictionary<int, string>();
            bool IsTure;
            public void InitLabel()
            {
                label.Text = "0";
                label.Location = new Point(100, 100);
                label.AutoSize = true;
                this.Controls.Add(label);
            }
            public void InitName()
            {
                string[] names = File.ReadAllLines("name.txt",Encoding.Default);
                for (int i = 0; i < names.Length; i++)
                {
                    Dic.Add(i, names[i]);
                }
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                IsTure = false;
            }
    
            private void btnBegin_Click(object sender, EventArgs e)
            {
                if (btnBegin.Text == "开始")
                {
                    btnBegin.Text = "结束";
                    IsTure = true;
                    new Thread(() =>
                    {
                        Random r = new Random();
                        while (IsTure)
                        {
                            if (label.InvokeRequired)//判段lable标签是否是由当前线程创建的,解决跨线程调用的问题
                            {
                                Action SetLabelText=delegate()//匿名委托
                                {
                                    label.Text = Dic[r.Next(0, Dic.Count)];
                                };
                                label.Invoke(SetLabelText);
                            }
                            Thread.Sleep(100);//当前线程休息一下
                        }
    
                    }).Start();
                }
                else
                {
                    IsTure = false;
                    btnBegin.Text = "开始";
                }
            }
        }
    }

     

    应用程序域:只有DotNet程序才会有的概念
     应用程序域就是隔离exe。可以加载多个程序集,
    一个进程可以有多个应用程序域
    一个应用程序域可以跑多个线程
    一个线程同一时间只可以执行在一个应用程序域里面,但线程可以穿透应用程序域
    例子:
           static void Main(string[] args)
            {
                AppDomain appDomain = AppDomain.CreateDomain("ghr");// 创建一个应用程序域
                appDomain.ExecuteAssembly("QQ.exe");//启动qq程序
                Console.WriteLine("主域执行完成");
            } 

     了解更多:http://msdn.microsoft.com/zh-cn/library/system.threading.thread_members

     

  • 相关阅读:
    「codeforces
    「sdoi2019
    「ABC 218」解集
    「hdu
    「atcoder
    「tricks」平凡二分幻术
    并查集
    Bellman-Ford算法 & SPFA & SPFA_DFS
    最近公共祖先(LCA)
    题解 P5751 【[NOI1999]01串】
  • 原文地址:https://www.cnblogs.com/guohuiru/p/3167027.html
Copyright © 2011-2022 走看看