结论:
能, 执行完的线程调用Join不会抛出错误。
Thread.Join()是什么?
Join()函数用于阻塞地等待线程结束, 其行为是在线程A中调用了线程B的Join()后, 线程A将一直阻塞在该函数处, 直到线程B执行完毕, 线程A才继续执行。
详细信息:
采用窗体应用程序对方法进行了测试。
测试思路是, 在构造函数中初始化线程, 线程的行为是不断输出某些信息以此判断线程的运行状态, 在窗体中调用线程中的Start、Join方法。
测试用代码:
注:使用了《重定向Console输出到文本框》中提供的TextBoxWriter类型。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using Console2TextBox; namespace ThreadFuncTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); Console.SetOut(new TextBoxWriter(textBox1)); thd = new Thread(new ThreadStart(Beh)); } public Thread thd; void Beh() { for (int i = 0; i < 20; i++) { Thread.Sleep(500); Console.WriteLine("t=" + i); } Console.WriteLine("fin"); } private void button1_Click(object sender, EventArgs e) { try { thd.Start(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } private void button2_Click(object sender, EventArgs e) { try { thd.Join(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } private void button3_Click(object sender, EventArgs e) { try { Console.WriteLine(thd.IsAlive.ToString()); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } } }
测试效果
线程启动前点击Join, 报错, 错误显示不允许在线程未启动时调用Join
线程启动时点击Join, 窗体卡住, 到一定时间后恢复响应, 输出全部数据(图略)
线程执行完成后电机Join, 窗体无任何变化, 这意味着Join能针对已经结束的线程顺利执行。这个特性对线程管理十分有益, 如果会抛出错误, 提前判断线程状态再执行Join则会产生线程状态更替的风险。
转载记得标出处哦 本文: https://www.cnblogs.com/eehow/p/13425002.html