作者:-像我这样笨拙的生活_992_559 | 来源:互联网 | 2023-10-12 07:34
Join,单词本事就是连接的意思。先贴出几段代码猜猜结果。publicstaticintMain(){AlphaoAlphanewAlpha();ThreadT
Join,单词本事就是连接的意思。
先贴出几段代码猜猜结果。
<1>
public static int Main(){ Alpha oAlpha &#61; new Alpha();Thread Thread1 &#61; new Thread(delegate() {Console.WriteLine("A"); });Thread1.Start(); Console.WriteLine("a");return 0;}
结果是先打印 A 还先打印 a &#xff1f;
<2>
public static int Main(){ Alpha oAlpha &#61; new Alpha();Thread Thread1 &#61; new Thread(delegate() {Console.WriteLine("A"); });Thread1.Start(); Thread1.Join();//注意这里Console.WriteLine("a");return 0;}
结果是先打印 A 还先打印 a &#xff1f;
------------------------------------------------------
<3>
static void Main(string[] args){//线程AThread ThreadA &#61; new Thread(delegate(){for (int i &#61; 0; i <10; i&#43;&#43;){Console.WriteLine("A : " );if (i &#61;&#61; 9){break;}Thread.Sleep(1000);}});//线程BThread ThreadB &#61; new Thread(delegate(){for (int i &#61; 0; i <5; i&#43;&#43;){Console.WriteLine("B : ");if (i &#61;&#61; 4){break;}Thread.Sleep(1000);}ThreadA.Join();//在这里插入线程Afor (int i &#61; 0; i <5; i&#43;&#43;){Console.WriteLine("C : " );if (i &#61;&#61; 4){break;}Thread.Sleep(1000);}});ThreadA.Start();ThreadB.Start();}
<4>
public static int Main(){Thread.CurrentThread.Join();Console.WriteLine("O(∩_∩)O哈哈");return 0;}
----------------------------------------------------
thread.Join把指定的线程加入到当前线程&#xff0c;可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法&#xff0c;直到线程A执行完毕后&#xff0c;才会继续执行线程B。
t.join(); //使调用线程 t 在此之前执行完毕。
t.join(1000); //等待 t 线程&#xff0c;等待时间是1000毫秒
运行结果&#xff1a;
1 A 和 a不分先后&#xff0c;Thread1线程很简单启动耗时非常小&#xff0c;Thread1线程和主线程几乎是同步的&#xff0c;所以打印A a不分前后根据CPU当时运行环境决定。
2 先打印A 再打印 a &#xff0c;因为Thread1执行了Join()&#xff0c;相当于在主线程中添加了Thread1线程&#xff0c;就是说只有当Thread1执行结束之后主线程才能继续执行。
换句话说在主线程中嵌了一段代码&#xff0c;只有这段代码执行结束&#xff08;这里不要以为调用了Join()线程Thread1会从头开始执行&#xff0c;不明白这句话可以运行下第3端程序&#xff09;&#xff0c;
主线程才可以继续执行后面的代码。
3 前5秒 A B交替出现&#xff0c;然后A出现5次&#xff0c;C出现5次。
如果注释掉ThreadA.Join()&#xff0c;那么结果是前5秒AB 交替出现 后5秒AC交替出现。
这里我就不再罗嗦了。还是那样线程B中join了线程A只有A执行结束&#xff0c;才可以继续执行线程B中剩下的代码。
join其实就是使异步执行线程转为同步执行。
4 主线程被终止
main线程等待main线程结束&#xff0c;而main本身未结束&#xff0c;所以这就形成一个圈子&#xff0c;变相地实现了main.sleep(无限)的功能。。。