Android主线程和子线程区别详解
程序员文章站
2023-12-13 22:44:58
主线程和子线程的区别
每个线程都有一个唯一标示符,来区分线程中的主次关系的说法。
线程唯一标示符: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.通常它必须最后完成执行比如执行各种关闭动作。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。