C# 多线程join的用法,等待多个子线程结束后再执行主线程
等待多个子线程结束后再执行主线程
class MultiThread
{
#region join test
public void MultiThreadTest()
{
Thread[] ths = new Thread[2];
ths[0] = new Thread(Method1);
ths[1] = new Thread(Method2);
foreach (Thread item in ths)
{
//首先让所有线程都启动
item.Start();
//试想一下在这里加上item.Join()可以达到我们所需要的效果吗?
//A:如果这阻塞了线程(启动item线程的线程,也就是主线程),那么启动了第一个线程之后
//主线程被阻塞,待线程1被执行完的时候再启动先一个线程。那么多线程就失去了意义,变成了同步。
}
foreach (Thread item in ths)
{
//数组中的所有子线程都对主线程进行阻塞,只是阻塞了启动
item.Join();
Thread.Sleep(1000);//用它来证明主线程是在启动了每一个子线程后才sleep的
}
Method3();
}
private void Method1()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("A");
Thread.Sleep(300);
}
}
private void Method2()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("B");
Thread.Sleep(300);
}
}
private void Method3()
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("C");
Thread.Sleep(300);
}
}
#endregion
}
自己建一个控制台程序进行测试吧!希望能对你有所启发!
C# 多线程join的用法,等待多个子线程结束后再执行主线程的更多相关文章
- Java Thread.join()详解--父线程等待子线程结束后再结束
目录(?)[+] 阅读目录 一.使用方式. 二.为什么要用join()方法 三.join方法的作用 join 四.用实例来理解 打印结果: 打印结果: 五.从源码看join()方法 join是Th ...
- Python多线程join的用法
import threading, time def Myjoin(): print 'hello world!' time.sleep(1) for i in range(5): t=threadi ...
- 等待某(N)个线程执行完再执行某个线程的几种方法(Thread.join(),CountDownLatch,CyclicBarrier,Semaphore)
1.main线程中先调用threadA.join() ,再调用threadB.join()实现A->B->main线程的执行顺序 调用threadA.join()时,main线程会挂起,等 ...
- join当前线程等待指定的线程结束后才能继续运行
模拟一个QQ游戏大厅斗地主 /** sleep(休眠.睡眠) join当前线程等待指定的线程结束后才能继续运行 */ class Player extends Thread{ private Stri ...
- java 多线程——join()方法
在java语言中,join()方法的作用是让调用该方法的线程在执行完run()方法后,再执行join 方法后面的代码. 简单点说就是,将两个线程合并,用于实现同步的功能. 具体而言:可以通过线程A的j ...
- 如何让线程A等待B执行结束后执行?
1. 使用条件变量 判断是否任务B已经做完,然后再执行任务A. 测试代码可看:https://blog.csdn.net/guochao6531/article/details/78075882 2. ...
- 使用join和CountDownLatch来等待线程结束
1.join方法的实现 join只能在start()之后调用, join 某个线程A,会使当前线程B进入等待,直到线程A结束生命周期(isAlive()==false) ,或者达到给定的时间. 在此期 ...
- Java多线程 -join用法
阿里面试官问我这个问题,我仔细总结了一下: 参考:sleep.yield.wait.join的区别(阿里面试) 1. join()介绍 join() 定义在Thread.java中.join() 的作 ...
- 你能说出多线程中sleep、yield、join的用法及sleep与wait区别?
Object中的wait.notify.notifyAll,可以用于线程间的通信,核心原理为借助于监视器的入口集与等待集逻辑 通过这三个方法完成线程在指定锁(监视器)上的等待与唤醒,这三个方法是以锁( ...
随机推荐
- plain framework 1 参考手册 入门指引之 许可协议
许可 介绍 Apache2 License 介绍 使用非常友好的阿帕奇2许可协议,你可以应用到你想用的任何应用上,如需修改源码,请保留原作者信息. Apache2 License Apache Lic ...
- 增量式PID计算公式4个疑问与理解
一开始见到PID计算公式时总是疑问为什么是那样子?为了理解那几道公式,当时将其未简化前的公式“活生生”地算了一遍,现在想来,这样的演算过程固然有助于理解,但假如一开始就带着对疑问的答案已有一定看法后再 ...
- [IPA]IOS In App Purchase(内购)验证
参考我之前的笔记 苹果内购笔记,在客户端向苹果购买成功之后,我们需要进行二次验证. 二次验证 IOS在沙箱环境下购买成功之后,向苹果进行二次验证,确认用户是否购买成功. 当应用向Apple服务器请求购 ...
- JS读取写入删除COOKIE的各种操作
1. .NET后置代码中获取 Response.Redirect("http://www.baidu.com?id=" +Request.Cookies["size&qu ...
- Samsung I9103刷cm-10.1的方法
按照官方网站的说明一步一步的做下去的时候发现在执行heimdall.exe文件的时候出现“不是win32的应用程序”的错误提示,因此决定按照其它方法安装recovery,然后再刷入CM10.1. sa ...
- 【QCon笔记】Native 和 Web 融合
#main img{width:100%;} 简介 理清 Native 和 Web 的亮点和痛点,借鉴对方亮点解决自身的痛点,并给出淘系 App 在这些方面的实践. Mobile Web 的协作能力底 ...
- Java读写文本文件
1 字符输入(FileReader , char) import java.io.IOException; import java.io.FileReader; public class ep10_1 ...
- Iterator遍历器 调用Symbol.Iterator属性,遍历器对象。
Iterator实现原理 创建一个指针对象,指向当前数据结构的起始位置.也就是说,遍历器对象本质上,就是一个指针对象. 第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员. 第二次调 ...
- EEG montage
Source: WikiPedia - Electroencephalography Since an EEG voltage signal represents a difference betwe ...
- ubuntu12.04禁止单用户本地无密码root登录
1)grub-mkpasswd-pbkdf2 拿到类似grub.pbkdf2.sha512.10000.C093FE6825CDCC2F84934ABC406445E92EE098733C60E6D1 ...