专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 一看就懂主线程和子线程的区别

一看就懂主线程和子线程的区别

更新时间:2022-07-07 11:20:10 来源:动力节点 浏览1397次

对于初学Java的小伙伴来说,对Java线程还不是很了解。每个线程都有一个唯一标示符,来区分线程中的主次关系的说法。

线程唯一标示符:Thread.CurrentThread.ManagedThreadID;

UI界面和Main函数均为主线程。

被Thread包含的“方法体”或者“委托”均为子线程。

委托可以包含多个方法体,利用this.Invoke去执行。

也可以定义多种方法体,放在Thread里面去执行。则此方法体均为子线程。注意如果要修改UI界面的显示。则需要使用this.Invoke,否则会报异常。

Main函数为主线程,id标示符与UI界面主线程相等

不多说了。看下面的测试代码注释吧。

public delegate void dele();
    public partial class Form1 : Form
    {
        int idA;
        public dele getlab;
        public Form1()
        {
            InitializeComponent();
            idA  = Thread.CurrentThread.ManagedThreadId;//UI界面主线程
            /*
             * Main函数为主线程,id标示符与UI界面主线程相同。
             */
        }
        Thread thread;
        private void getbtu_Click(object sender, EventArgs e)//UI控件属于主线程
        {
            int idB = Thread.CurrentThread.ManagedThreadId;
            getlab = new dele(getLabel);//委托添加方法
            getlab += new dele(gg);//委托在叠加一个方法
            getlab += new dele(kk);//委托在叠加一个方法
            //
            thread = new Thread(new ThreadStart(delegate
            {
                int idC = Thread.CurrentThread.ManagedThreadId;//Thread开辟一个子线程
                //gg();//方法直接在thread里面调用均为子线程
                //kk();//方法直接在thread里面调用均为子线程
                getlab();//委托直接在thread里面调用,委托里面的方法为子线程

                //以上因为都包含在thread里面
                MessageBox.Show("显示完成");
                //this.Invoke(getlab);
                /*错误提示:主线程调用主线程当然会假死*/
            }));
            thread.IsBackground = true;
            thread.Start();
        }
        public void kk()//委托中的方法  委托方法三
        {
            int idR = Thread.CurrentThread.ManagedThreadId;
            this.Invoke((dele)(() =>//修改UI界面值则需要加this.Invoke
            {                 
                    label2.Text = "ABC";
            }));
        }
        public void gg()//委托中的方法  委托方法二
        {
            int idP = Thread.CurrentThread.ManagedThreadId;
            this.Invoke((dele)(() =>//修改UI界面值则需要加this.Invoke
            {
                    label3.Text = "QWE";
            }));
        }
        public void getLabel()//委托中的方法 委托方法一
        {       
            int idD = Thread.CurrentThread.ManagedThreadId;//子线程

            for (int i = 0; i <= 1000; i++)
            {
                Thread.Sleep(10);
                //this.Invoke为主线程,执行子线程的内容
                this.Invoke((dele)(() =>
                {
                    getlabel.Text = i.ToString();
                    int idE = Thread.CurrentThread.ManagedThreadId;//主线程
                    Console.WriteLine("线程idE:" + idE);
                }));
                Console.WriteLine(i);
            }
            MessageBox.Show("显示完成");
        }
        private void sleepbtu_Click(object sender, EventArgs e)//UI控件属于主线程
        {
            int idF = Thread.CurrentThread.ManagedThreadId;
            try
            {
                if (thread.ThreadState != ThreadState.Suspended)
                {
                    thread.Suspend();
                }
            }
            catch (Exception r)
            {
                MessageBox.Show(r.Message);
            }
        }
        private void setbtu_Click(object sender, EventArgs e)//UI控件属于主线程
        {
            int idG = Thread.CurrentThread.ManagedThreadId;
            try
            {
                if (thread.ThreadState != ThreadState.Running)
                {
                    thread.Resume();
                }
            }
            catch (Exception r)
            {
                MessageBox.Show(r.Message);
            }
        }
        public void getlabel_Click(object sender, EventArgs e)
        {
        }
    }

总结:

1. 什么是子线程?

包含在 Thread thread = new Thread(new ThreadStart(delegate{}));里面均视为子线程。

2. 什么是主线程?

当一个程序启动时,就有一个进程被操作系统(OS)创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程(Main Thread),因为它是程序开始时就执行的,如果你需要再创建线程,那么创建的线程就是这个主线程的子线程。每个进程至少都有一个主线程,在Winform中,应该就是创建GUI的线程。

主线程的重要性体现在两方面:

(1)是产生其他子线程的线程;

(2)通常它必须最后完成执行比如执行各种关闭动作。

通过上述介绍,相信大家对主线程和子线程的区别已经有所了解,大家如果想了解更多相关知识,可以关注一下动力节点的Java基础教程,里面有更丰富的知识等着大家去学习,希望对大家能够有所帮助。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>