Thread系列之Thread.Join()
Thread.Join()方法,顾名思义,在一个线程中加入一些东西。
MSDN上解释其作用为:阻塞 “调用线程” 直到某个线程结束。
这个翻译过来的解释有点晦涩。举个例子如下:
static void Main()
{
Thread t=new Thread(new ThreadStart(ThreadMethod));
t.Start();
t.Join();
Console.WriteLine("I am Main Thread");
Console.Read();
}
void ThreadMethod()
{
...
}
从上面的代码中,我们可以看到存在两个线程:主线程和线程t
回到Join,这里所说的调用方就是主线程,主线程调用线程t的Join方法,导致主线程阻塞,直到t线程执行完毕,才返回到主线程中。
简单理解,在主线程中调用t.Join(),也就是在主线程中加入了t线程的代码,必须让t线程执行完毕之后,主线程(调用方)才能正常执行。
代码示例:
{
// AutoResetEvent autoEvent = new AutoResetEvent(false);
Thread regularThread =new Thread(new ThreadStart(ThreadMethod));
regularThread.Start();
ThreadPool.QueueUserWorkItem(new WaitCallback(WorkMethod1),regularThread);
Console.WriteLine("i am main thread!");
// regularThread.Join();
Console.WriteLine("i am main thread!");
// autoEvent.WaitOne();
Console.Read();
}
staticvoid ThreadMethod()
{
for (int i =0; i <5; i++)
{
Console.WriteLine("ThreadOne 第 {0} 次执行,executing ThreadMethod,is {1} from the thread pool.",i+1, Thread.CurrentThread.IsThreadPoolThread ?"" : "not");
Thread.Sleep(1000);
}
}
staticvoid WorkMethod1(object stateInfo)
{
Console.WriteLine("ThreadTwo,executing WorkMethod,is {0} form the thread pool.", Thread.CurrentThread.IsThreadPoolThread ?"" : "not");
// ((AutoResetEvent)stateInfo).Set();
((Thread)stateInfo).Join();
for (int i =0; i <5; i++)
{
Console.WriteLine("ThreadTwo 第 {0}次执行,executing WorkMethod,is {1} form the thread pool.",i+1, Thread.CurrentThread.IsThreadPoolThread ?"" : "not");
}
}
代码中,存在三个线程:主线程、regularThread和线程池中的一个线程。在线程池中的线程中调用了regularThread.Join()方法;
执行结果:
可以看到线程池中线程循环中的内容在regularThread的内容执行完毕之后才执行。
转载于:https://www.cnblogs.com/xyqCreator/archive/2013/01/10/2854446.html
Thread系列之Thread.Join()相关推荐
- Java 中Thread的sleep、join、yield方法解析
1.Thread中sleep方法作用是使当前线程等待,其他线程开始执行,如果有线程锁,sleep不会让出锁 没有加锁代码如下: public class SynchronizedSleepMethod ...
- Thread类中的join方法
package charpter06; //类实现接口 public class Processor implements Runnable { // 重写接口方法 @Override public ...
- Thread系列——Thread.Sleep(0)
转载自:http://www.cnblogs.com/ATually/archive/2010/10/21/1857261.html 线程这一概念,可以理解成进程中的一个小单元.这个单元是一个独立的执 ...
- Android Thread第二次Thread.start()报错的疑问
为什么80%的码农都做不了架构师?>>> 网上说Thread不需要stop()的原因是因为运行到尾部就会自动释放,而代码: Thread myThread = new Thre ...
- php5.6non thread safe 区别,PHP版本Non Thread Safe和Thread Safe如何选择?区别是什么?
PHP版本分为Non Thread Safe和Thread Safe,Non Thread Safe是指非线程安全,Thread Safe是指线程安全,区别是什么?如何选择? Non Thread S ...
- Thread.yield()和Thread.sleep(0)
关于Thread.yield()和Thread.sleep(0)的语义问题真是一个让人挠头的问题,翻了好多资料,在java6语言规范中看到了一段这样的描述: 重点在红框中,简而言之就是:sleep(0 ...
- 【java】Thread.Sleep 与 Thread.onSpinWait
1.概述 转载:[java]Thread.Sleep 与 Thread.onSpinWait 2.Thread.Sleep 一般情况下,我们让线程等待一段时间都是使用Thread.sleep()命令. ...
- Thread.interrupted()与Thread.currentThread().isInterrupted()区别
背景 今天在研究ThreadPoolExecutor源码时,在runWorker(Worker w)的方法中有一个判断条件分别用到了Thread.interrupted()和Thread.curren ...
- Thread.currentThread().interrupt()和Thread.interrupted()和Thread.currentThread().isInterrupted()
Thread.interrupted() 可以返回当前标志位并使标志位为false Thread.currentThread().interrupt() 可以使标志位置为true Thread.cur ...
最新文章
- 系统架构师学习笔记_第五章(下)_连载
- 转从Qt4 到Qt5的变化
- 二数和,三数和,四数和的优化总结
- 成功解决ValueError: Shape of passed values is (33, 1), indices imply (33, 2)
- 预算为0如何拉用户?类类教你5个独门绝技,并说说一些陷阱!
- VTK:BrownianPoints布朗点用法实战
- Jquery Ajax 登录,服务端分别为 aspx,ashx,asmx
- 怎么解决缺少java.doc_java 生成doc帮助文档时出现的问题
- 设计师经常逛的网站?
- Qt编写OpenMP程序--双循环
- DanmuManager 一个简单的弹幕工具
- android维文字体下载,Badam维汉输入法
- 宾馆客房管理系统Mysql数据库课程设计
- Linux下使用和配置magick
- 面试软件测试总结(常见的面试问题)
- Html页面Js调用android本地相机和图片
- 微信小程序存在的风险_警惕,你的微信小程序可能面临着风险!
- opengl进行绿色屏幕抠图
- 8B/10B编码原理详解、Verilog实现及在JESD204B中的应用
- 白银价格转换器(美元/盎司-人民币/克)
热门文章
- 流程的python-读《流畅的python》第一天
- r语言和python-R语言和Python一块学习会弄混吗
- python自学网站推荐-杭州python自学网站
- python可以做什么开发-python适合做什么开发_python未来发展怎么样
- python编程语言能干什么-python编程语言的优势与劣势--python能干啥
- python教程第四版pdf下载-笨办法学python第四版 电子书(pdf格式)
- python视频课程推荐-《Python从小白到大牛》全集视频课程介绍
- python与人工智能编程-总算明白python人工智能编程入门案例
- python项目开发案例-Python项目开发案例集锦 PDF 全彩超清版
- 学python的基础-老司机学python篇:第一季(基础速过、机器学习入门)