zoukankan      html  css  js  c++  java
  • 线程笔记

    一        private void button1_Click(object sender, EventArgs e)
            {
                CountTime();
            }
            //准备方法给线程调用
            void CountTime()
            {
                for (int i = 0; i < 999999999; i++)
                {
                }
                MessageBox.Show("循环完毕!");
            }
            //使用多线程来解决UI卡死问题
            private void button2_Click(object sender, EventArgs e)
            {
                //创建线程对象 传入 要线程执行的方法
                Thread threadFirst = new Thread(CountTime);
                threadFirst.Start();
            }
    二、    产生一个线程的4个步骤:
        1 编写产生线程所需要执行的方法
        2 引用System.Threading命名空间
        3 实例化Thread类,并传入一个指向线程所需要运行方法的委托(这个时候线程已经产生,但是海没有运行)
        4 调用Thread实例的Start方法,标记该线程可以被CPU执行了,但具体执行时间又CPU决定
     
    三    前台线程和后台线程
        前台线程:只有所有的前台线程都关闭才能完成程序关闭
        后台线程:只要所有的前台线程结束,后台线程自动结束
    //使用多线程来解决UI卡死问题
    private void button2_Click(object sender, EventArgs e)
    {
    //创建线程对象 传入 要线程执行的方法
    Thread threadFirst = new Thread(CountTime);
    //将线程设置为后台线程
    threadFirst.IsBackground=true;
    threadFirst.Start();
    }
     
    四 线程 方法重入问题
            线程间操作无效: 从不是创建控件“textBox1”的线程访问它。
    //关闭 当前窗体 对废话跨线程访问 修改文本框控件的 检查
                TextBox.CheckForIllegalCrossThreadCalls = false;
             void ChangeTxt()
            {
                lock (this)
                {
                    for (int i = 0; i < 1000; i++)
                    {
                        int a = int.Parse(textBox1.Text);
                        a++;
                        textBox1.Text = a.ToString();
                    }
                }
            }

            //方法重入问题
            private void button3_Click(object sender, EventArgs e)
            {
                Thread thread = new Thread(ChangeTxt);
                thread.IsBackground = true;
                thread.Start();
                Thread thread2 = new Thread(ChangeTxt);
                thread.IsBackground = true;
                thread2.Start();
            }
    不加lock 两个线程会有CPU分配调用执行 加上后会先调用的线程执行完后才会由第二个线程去执行
     
    五 Thread类的一些重要成员
        Start()启动线程
        Abort()终止线程
        Thread.Sleep(1) 静态方法,可以使当前线程停止一段时间运行
        Name 线程名
        Thread.CurrentThread获得当前的线程引用
     
    六 模拟线程内部结构
    //模拟线程 
    public class MyThread
    {
        //------------不带参数------------
        ThreadStart threads;//定义全局变量
        public MyThread(ThreadStart ts)//要求用户在 实例化new的时候传入方法委托
        {
            this.threads = ts;//将委托 赋给全局变量
        }
        public void Start()
        {
            threads();//调用委托,执行委托里的方法
        }

        //--------------带参数------------
        ParameterizedThreadStart pts;//定义全局变量
        public MyThread(ParameterizedThreadStart pts)//要求用户在 实例化new的时候传入方法委托
        {
            this.pts = pts;//将委托 赋给全局变量
        }
        public void Start( object o)
        {
            pts(o);//调用委托,执行委托里的方法
        }
    }
    //调用模拟多线程
            MyThread mth = new MyThread(CountTime);
     //执行带参数方法
    void ShowTxtName(object name)
            {
                if (name!=null)
                {
                    MessageBox.Show("name=" + name.ToString());
                }
                else
                {
                    MessageBox.Show("null");
                }
            }

            private void button4_Click(object sender, EventArgs e)
            {
                Thread thread = new Thread(ShowTxtName);//必须为object类型参数
                thread.IsBackground = true;
                thread.Start(textBox2.Text);//传入object参数 public void Start(object parameter);
            }
     
    //线程 执行带多个参数方法
            void ShowTxtName2(object li)
            {
                List<string >list=li as List<string >;
                if (list!=null)
                {
                    foreach (string s in list)
                    {
                        MessageBox.Show(s);
                    }
                }
            }
            private void button5_Click(object sender, EventArgs e)
            {
                Thread thread5 = new Thread(ShowTxtName2);
                thread5.IsBackground = true;
                thread5.Start(new List<string>() {"刘德华","王力宏","那英" });
            }
     
    七    线程的调度方式
     1    非抢占式调度:指某个线程在运行时不会被操作系统强制暂停,它可以持续的运行直至运行告一段落并主动地交出运行权。在这样的调度模式下,线程的运行就是完全的单队列的,并且可能产生恶意程序长期霸占运行权的情况。而且一旦一个程序死了,那么只能重启电脑
     2    抢占式调度:每个线程都只有极少的运行时间,而当时间用完时该线程就会被强制暂停,保存上下文(线程寄存器中)并把CPU运行权交给下一个线程,这样调度的结果就是所有的线程都在被快速地切换运行,使得使用者觉得所有的线程在“并行”的运行。
            




  • 相关阅读:
    SpringBoot-Maven打包压缩瘦身
    Docker安装Jenkins
    Spring Boot 微服务应用集成Prometheus + Grafana 实现监控告警
    Spring Boot构建 RESTful 风格应用
    SpringMVC 中 @ControllerAdvice 注解
    Spring Boot 整合 Freemarker
    Spring Boot中的静态资源文件
    SpringBoot配置文件 application.properties,yaml配置
    代码质量管理-安全问题
    8.Python基础 面向对象的基本概念
  • 原文地址:https://www.cnblogs.com/liuzhiye/p/2706033.html
Copyright © 2011-2022 走看看