黑马程序员-我的入学笔记8-多线程的初次了解

来源:互联网 发布:两个移动硬盘对拷数据 编辑:程序博客网 时间:2024/05/16 18:46

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

  今天再次看了关于多线程的视频,我发现同一段视频,再看第二遍,第三遍的时候,你的注意力在不同的点,这时才真正的理解了老师要讲解的内容.也许这就是读书百遍而意自现吧.通过老师视频中的画图和列子,我基本能够理解多线程的作用是怎么样的,但具体计算机内部怎么实现的还不知道,这里占时不去深究.在程序中线程怎么定义的,怎么使用的基本了解了,并自己写出来了代码实现了.通过这些天的学习,我发现我们的注意力要集中在重点上,要循序渐进的学习,不能广撒网,结果什么都理解的不透彻,程序内部的具体实现,等以后有了一定的基础,理解起来更容易.下面是我自己敲下视频中的代码

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Threading;//这里必须要引用线程的命名空间namespace 有关多线程{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();            //这里屏蔽了对错误线程调用的警告            TextBox.CheckForIllegalCrossThreadCalls = false;        }        //单线程的缺点        private void btnSingleThread_Click(object sender, EventArgs e)        {            //for (int i = 0; i < 999999999; i++)            //{            //}            //MessageBox.Show("循环完毕~~~~~~");            CountTime();        }        /// <summary>        /// 循环计数封装成方法,便于调用        /// </summary>        void CountTime()//没有返回值和参数        {            //获取循环刚开始的时间            DateTime beginTime = DateTime.Now;            for (int i = 0; i < 999999999; i++)            {            }            //通过方法当前时间减去刚开始的时间,赋给ts            TimeSpan ts = beginTime.Subtract(DateTime.Now);            //再截取ts的秒表,得到所用的秒数            MessageBox.Show("循环完毕~~~~~~"+ts.TotalMilliseconds);        }               //使用多线程解决UI卡死问题        private void btnDoubleThread_Click(object sender, EventArgs e)        {            //完整的写法,先创建一个委托,再将委托传给线程调用            //ThreadStart ts=new ThreadStart(CountTime);            //Thread threadFirst = new Thread(ts);            //新建一个线程,传入线程的参数,一个没有返回值和参数的方法            Thread threadFirst = new Thread(CountTime);            //调用线程的属性,设置成后台线程,当前台所有线程结束时,后台线程直接退出            threadFirst.IsBackground = true;            //调用线程的Start方法,启动线程            threadFirst.Start();        }        /// <summary>        /// 改变文本框的值的方法        /// </summary>        void ChangeTxt()        {            for (int i = 0; i < 1000; i++)            {                int a = Convert.ToInt32(txtNum1.Text);                //控制台写出当前运行的线程,和a的值的变化                Console.WriteLine(Thread.CurrentThread.Name + ",a=" + a);                a++;                txtNum1.Text = a.ToString();            }        }        //两个线程同时调用一个方法,导致的线程重入的问题        private void btDoubleRepeat_Click(object sender, EventArgs e)        {            Thread thread1 = new Thread(ChangeTxt);            //线程的姓名属性            thread1.Name = "t1";            thread1.IsBackground = true;            thread1.Start();            Thread thread2 = new Thread(ChangeTxt);            thread2.Name = "t2";            thread2.IsBackground = true;            thread2.Start();        }        /// <summary>        /// 带参数的方法        /// </summary>        /// <param name="name"></param>        void ShowTextNum2(object name)        {            MessageBox.Show(name.ToString());        }        //执行带参数方法的线程        private void button1_Click(object sender, EventArgs e)        {            //完整的写法,new了带参数的委托            //ParameterizedThreadStart pts = new ParameterizedThreadStart(ShowTextNum2);            //Thread thread = new Thread(pts);            Thread thread = new Thread(ShowTextNum2);            thread.IsBackground = true;            //执行带参数的Start方法            thread.Start(txtNum2.Text);        }        /// <summary>        /// 带多个参数的方法        /// </summary>        /// <param name="name"></param>        void ShowTextNum3(object li)        {            List<string> listName = li as List<string>;            if (li != null)            {                foreach (string s in listName)                {                    MessageBox.Show(s);                }            }        }        //调用带多个参数方法的线程        private void button3_Click(object sender, EventArgs e)        {            Thread tread3 = new Thread(ShowTextNum3);            tread3.IsBackground = true;            //这里的用集合直接将多个参数赋给方法            tread3.Start(new List<string>(){"jim","lucy","tom"});        }               //模拟线程的定义        public class MyThread        {            ThreadStart ts;            ParameterizedThreadStart pts;            public MyThread(ThreadStart ts)            {                this.ts = ts;            }            public MyThread(ParameterizedThreadStart pts)            {                this.pts = pts;            }            public void Start(object o)            {                if (o == null)                {                    Thread tts = new Thread(ts);                    tts.Start();                }                else                {                    Thread ptts = new Thread(pts);                    ptts.Start(o);                }            }        }        //用了自己定义的线程        private void button2_Click(object sender, EventArgs e)        {            MyThread tts = new MyThread(ChangeTxt);            tts.Start(null);        }    }}
 学习是一个循序渐进的过程,也是在不断的自我调整,学习更有效的学习方法的过程,还有不断的合理分配利用好时间,和加强自制力的过程,在这个过程中不断的努力.

原创粉丝点击