Android主线程和子线程区别详解
主线程和子线程的区别
每个线程都有一个唯一标示符,来区分线程中的主次关系的说法。
线程唯一标示符:Thread.CurrentThread.ManagedThreadID;
- UI界面和Main函数均为主线程。
- 被Thread包含的“方法体”或者“委托”均为子线程。
- 委托可以包含多个方法体,利用this.Invoke去执行。
- 也可以定义多种方法体,放在Thread里面去执行。则此方法体均为子线程。注意如果要修改UI界面的显示。则需要使用this.Invoke,否则会报异常。
- Main函数为主线程,id标示符与UI界面主线程相等
不多说了。看下面的测试代码注释吧。
publicdelegatevoiddele(); publicpartialclassForm1:Form { intidA; publicdelegetlab; publicForm1() { InitializeComponent(); idA=Thread.CurrentThread.ManagedThreadId;//UI界面主线程 /* *Main函数为主线程,id标示符与UI界面主线程相同。 */ } Threadthread; privatevoidgetbtu_Click(objectsender,EventArgse)//UI控件属于主线程 { intidB=Thread.CurrentThread.ManagedThreadId; getlab=newdele(getLabel);//委托添加方法 getlab+=newdele(gg);//委托在叠加一个方法 getlab+=newdele(kk);//委托在叠加一个方法 // thread=newThread(newThreadStart(delegate { intidC=Thread.CurrentThread.ManagedThreadId;//Thread开辟一个子线程 //gg();//方法直接在thread里面调用均为子线程 //kk();//方法直接在thread里面调用均为子线程 getlab();//委托直接在thread里面调用,委托里面的方法为子线程 //以上因为都包含在thread里面 MessageBox.Show("显示完成"); //this.Invoke(getlab); /*错误提示:主线程调用主线程当然会假死*/ })); thread.IsBackground=true; thread.Start(); } publicvoidkk()//委托中的方法委托方法三 { intidR=Thread.CurrentThread.ManagedThreadId; this.Invoke((dele)(()=>//修改UI界面值则需要加this.Invoke { label2.Text="ABC"; })); } publicvoidgg()//委托中的方法委托方法二 { intidP=Thread.CurrentThread.ManagedThreadId; this.Invoke((dele)(()=>//修改UI界面值则需要加this.Invoke { label3.Text="QWE"; })); } publicvoidgetLabel()//委托中的方法委托方法一 { intidD=Thread.CurrentThread.ManagedThreadId;//子线程 for(inti=0;i<=1000;i++) { Thread.Sleep(10); //this.Invoke为主线程,执行子线程的内容 this.Invoke((dele)(()=> { getlabel.Text=i.ToString(); intidE=Thread.CurrentThread.ManagedThreadId;//主线程 Console.WriteLine("线程idE:"+idE); })); Console.WriteLine(i); } MessageBox.Show("显示完成"); } privatevoidsleepbtu_Click(objectsender,EventArgse)//UI控件属于主线程 { intidF=Thread.CurrentThread.ManagedThreadId; try { if(thread.ThreadState!=ThreadState.Suspended) { thread.Suspend(); } } catch(Exceptionr) { MessageBox.Show(r.Message); } } privatevoidsetbtu_Click(objectsender,EventArgse)//UI控件属于主线程 { intidG=Thread.CurrentThread.ManagedThreadId; try { if(thread.ThreadState!=ThreadState.Running) { thread.Resume(); } } catch(Exceptionr) { MessageBox.Show(r.Message); } } publicvoidgetlabel_Click(objectsender,EventArgse) { } }
总结:
1.什么是子线程?
包含在Threadthread=newThread(newThreadStart(delegate{}));里面均视为子线程。
2.什么是主线程?
当一个程序启动时,就有一个进程被操作系统(OS)创建,与此同时一个线程也立刻运行,该线程通常叫做程序的主线程(MainThread),因为它是程序开始时就执行的,如果你需要再创建线程,那么创建的线程就是这个主线程的子线程。每个进程至少都
有一个主线程,在Winform中,应该就是创建GUI的线程。
主线程的重要性体现在两方面:
1.是产生其他子线程的线程;
2.通常它必须最后完成执行比如执行各种关闭动作。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。