当前位置: 移动技术网 > IT编程>移动开发>Android > Android主线程和子线程区别详解

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

yoohoo音译歌词,夜班经理第一季下载,老何和雪梅偷媳01

主线程和子线程的区别

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

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网