欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android主线程和子线程区别详解

程序员文章站 2023-11-30 22:17:16
主线程和子线程的区别 每个线程都有一个唯一标示符,来区分线程中的主次关系的说法。 线程唯一标示符:thread.currentthread.managedthread...

主线程和子线程的区别

每个线程都有一个唯一标示符,来区分线程中的主次关系的说法。
线程唯一标示符: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.通常它必须最后完成执行比如执行各种关闭动作。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。