主线程和子线程的区别

每个线程都有一个唯一标示符,来区分线程中的主次关系的说法。

线程唯一标示符: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)
        {

        }
    }

总结: 
UI界面和Main函数均为主线程,除了“不包含在Thread里面的程序”均可 视为主线程。包含在 Thread thread = new Thread(new ThreadStart(delegate{ 
}));里面均视为子线程。

原文地址:https://www.cnblogs.com/yanglang/p/9067282.html

时间: 2024-11-02 20:25:33

主线程和子线程的区别的相关文章

Java实现主线程等待子线程

本文介绍两种主线程等待子线程的实现方式,以5个子线程来说明: 1.使用Thread的join()方法,join()方法会阻塞主线程继续向下执行. 2.使用Java.util.concurrent中的CountDownLatch,是一个倒数计数器.初始化时先设置一个倒数计数初始值,每调用一次countDown()方法,倒数值减一,他的await()方法会阻塞当前进程,直到倒数至0. join方式代码如下: [java] view plain copy package com.test.thread

C#主线程等待子线程运行结束

佐左佑右 原文 C#主线程等待子线程运行结束 由于主程序中调用matlab的dll文件进行计算要用较长的时间,主界面会有很长时间的卡顿,造成的用户感受十分不好,因此我想在调用时,将调用放入子线程中,然后在主线程中弹出一个提示框,显示数据正在加载,等子线程运行结束后,主线程继续工作. 使用的是http://hi.baidu.com/oktell/item/5527f51d93abb4a5feded5a8中所提到的方法,用了这篇文章中的第一个方式,即不带参数的. 之后在其中加入了显示和关闭提示框的代

Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)

keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主要研究Handler的消息发送. 包含主线程往子线程发送消息,子线程之间互相发送消息. 一.主线程向子线程发送消息. 实现过程比較简单: 主线程发送消息到异步线程.异步线程接收到消息后在再发送一条消息给主线程. 1. 初始化主线程的Handler,用来接收子线程的消息. 2. 启动异步线程.在异步线

Android主线程、子线程通信(Thread+handler)

Android是基于Java的,所以也分主线程,子线程! 主线程:实现业务逻辑.UI绘制更新.各子线程串连,类似于将军: 子线程:完成耗时(联网取数据.SD卡数据加载.后台长时间运行)操作,类似于小兵: 一.子线程向主线程发消息(Thread+handler): 1.主线程中定义Handler: Java代码   Handler mHandler = new Handler(){ @Override public void handleMessage(Message msg) { super.h

第一章、主线程与子线程

第一章.主线程与子线程 但我们打开FBReader程序的一刻,代码会立即创建一个子线程.之后,主线程会负责在屏幕上显示一个进度条,而子线程则在后台开始读取epub文件. PS:进度条的样子如下图所示,不过由于加载速度很快,这进度条都是一闪而过的.这张图片是在单步调试的环境下截取的. 在这一章,我们将详细介绍,程序如何创建子线程,以及如何控制进度条的显示与消失. 本章涉及的核心类是UIUtil类. FBReader默认首先进入的FBReader类,这是在AndroidManifes.xml设定的.

(转)C#/.NET主线程与子线程之间的关系

一般 一个应用程序就对应一个进程,一个进程可有一个或多个线程,而一般有一个主线程. 有的博客上说“至少一个主线程”,这一说法持有怀疑         主线程与子线程之间的关系         **默认情况,在新开启一个子线程的时候,他是前台线程,只有,将线程的IsBackground属性设为true;他才是后台线程         *当子线程是前台线程,则主线程结束并不影响其他线程的执行,只有所有前台线程都结束,程序结束         *当子线程是后台线程,则主线程的结束,会导致子线程的强迫结

Qt之主线程与子线程通信(linux下)

转载请注明出处:http://blog.csdn.net/feng1790291543  主线程与子线程通信主要是通过Qt上的G ui按钮,触发使得主线程上的信息发送到子线程中,并且时刻监测线程的运行情况 主线程,头文件: #ifndef MANAGEWIDGET_H #define MANAGEWIDGET_H #include <QtGui/QWidget> #include <QtCore> //#include "childwidget.h" //#in

设置主线程等待子线程执行的方法

首先要注意的是: 1.java的Main线程结束之后,子线程还在运行.其实主线程已经退出了,但是JVM守护线程会等待所有的线程结束,才会退出.所以我们可以看到,子线程依然在继续执行. 2.那么如何实现主线程等待子线程的执行之后再结束,这个就要用到CountDownLatch,设置要执行的线程的个数,然后再子线程的run方法中调用countDown()的方法,递减线程的计数.在主线程结束之前,调用await()的方法,一直等待. 实现如下: public class Main extends Th

Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息

MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.widget.TextView; /** * Demo描述: * * 示例步骤如下: * 1 子线程给子线程本身发送消息 * 2 收到1的消