今天刚开始学多线程,尽管以前用过一点点,但是只是照着网上代码抄,没有真正理解,现在回过头来想研究研究,慢慢弄懂,下面就是我在网上所找资料的例子,相信大家都看过,做了小点改动

View
Code

 1 namespace 多线程
2 {
3 public class Simple
4 {
5
6 public static int Main()
7 {
8 Console.WriteLine("Thread Start/stop/join sample");
9 Alpha alpha = new Alpha();
10 Thread t = new Thread(new ThreadStart(alpha.Beta));
11 t.Start();
12 while (!t.IsAlive) Thread.Sleep(1);
13 t.Abort();
14 //t.Join();
15 Console.WriteLine("alpha.Beta 已经结束,执行状态为"+t.IsAlive.ToString()+"线程状态为:"+t.ThreadState.ToString());
16 try
17 {
18 Console.WriteLine("试图重新启动 alpha.Beta");
19 t.Start();
20 }
21 catch(ThreadStateException) {
22 Console.WriteLine("ThreadStateException 试图重新启动t线程");
23 Console.WriteLine("t线程终止后不能被重启");
24 Console.ReadLine();
25 }
26 return 0;
27 }
28
29 }
30 public class Alpha {
31 public void Beta() {
32 while (true) {
33 Console.WriteLine("Alpha.Beta 正在运行");
34 }
35 }
36 }
37 }

这段代码非常好懂,但是有一点我不懂的是我以前一直认为abort()方法会使线程终止,为什么还要调用线程t的join方法呢?官方给的解释是abort():以开始终止此线程的过程,调用此方法通常会终止此线程,join():阻止调用某个线程,直到某个线程终止为止。当时死都想不通这两句话,直到把t.IsAlive(表示当前线程的执行状态)和t.ThreadState(该值包含线程的状态)打印出来后再想明白,现在先看看上面代码的运行结果:

奇怪,为什么线程abort()后isalive执行状态还是为TRUE呢,再看线程状态为AbortRequested,这意思是说线程已调用abort,但线程还未停止,于是再想想线程没停止,isalive属性为TRUE就变得合理了,那下面TRY语句块内再对线程重启就会产生错误了,都没停止何来产生重启呢?

但是问题还没有解决,如何才能让线程终止呢,难道abort不能让纯种终止吗?好了,先不要想那么多,我们把上述代码中t.join()注释符号给去掉,再来运行一下程序,结果如下:

好了,现在看看执行关态和线程状态我们得知线程终止了,而我们知道,当一个线程再调用abort()后是不能再start()了,所以同样会抛出异常,执行catch语句。综合两种情况来看,开始我还以为,难道只用abort()不用join()就不能终止线程吗?但是再对着两种结果和两个方法给出的介绍仔细想想就不难得出以下结论:
1.abort()的功能是用来终止调用此方法的线程的,只是在多数情况下,它需要一点时间,有些延迟(可能在短时间内此线程还在执行)...
2.join()方法它的功能不是终止线程,而是在t线程终止之前,阻止正在结束(调用了abort()方法但还未结束)的t线程执行,同时使主线程等待,直到t线程终止(也就是abort()方法终止过程完毕)了再执行下面的代码,打印出来的结果,执行状态就为FALSE,线程状态也为停止了


注意:在没有调用JOIN方法前,这段代码的执行结果可能为图中两种结果,都会存在,这可能根据电脑的不同,abort()执行时间有关,所以,这里join保证了我们在执行下面的代码时,t线程实现了“真正”的终止,我想这就是join用在abort()后的妙处吧!

C#多线程学习笔记之(abort与join配合使用)的更多相关文章

  1. java多线程学习笔记——详细

    一.线程类  1.新建状态(New):新创建了一个线程对象.        2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中, ...

  2. JAVA多线程学习笔记(1)

    JAVA多线程学习笔记(1) 由于笔者使用markdown格式书写,后续copy到blog可能存在格式不美观的问题,本文的.mk文件已经上传到个人的github,会进行同步更新.github传送门 一 ...

  3. java进阶-多线程学习笔记

    多线程学习笔记 1.什么是线程 操作系统中 打开一个程序就是一个进程 一个进程可以创建多个线程 现在系统中 系统调度的最小单元是线程 2.多线程有什么用? 发挥多核CPU的优势 如果使用多线程 将计算 ...

  4. Java多线程学习笔记(一)——多线程实现和安全问题

    1. 线程.进程.多线程: 进程是正在执行的程序,线程是进程中的代码执行,多线程就是在一个进程中有多个线程同时执行不同的任务,就像QQ,既可以开视频,又可以同时打字聊天. 2.线程的特点: 1.运行任 ...

  5. 多线程学习笔记九之ThreadLocal

    目录 多线程学习笔记九之ThreadLocal 简介 类结构 源码分析 ThreadLocalMap set(T value) get() remove() 为什么ThreadLocalMap的键是W ...

  6. java 多线程学习笔记

    这篇文章主要是个人的学习笔记,是以例子来驱动的,加深自己对多线程的理解. 一:实现多线程的两种方法 1.继承Thread class MyThread1 extends Thread{ public ...

  7. Java多线程学习笔记--生产消费者模式

    实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...

  8. Java多线程学习笔记

    进程:正在执行中的程序,其实是应用程序在内存中运行的那片空间.(只负责空间分配) 线程:进程中的一个执行单元,负责进程汇总的程序的运行,一个进程当中至少要有一个线程. 多线程:一个进程中时可以有多个线 ...

  9. C# 多线程学习笔记 - 2

    本文主要针对 GKarch 相关文章留作笔记,仅在原文基础上记录了自己的理解与摘抄部分片段. 遵循原作者的 CC 3.0 协议. 如果想要了解更加详细的文章信息内容,请访问下列地址进行学习. 原文章地 ...

随机推荐

  1. Python列表生成器

    本篇将介绍python生成器,更多内容请参考:python学习指南 前言 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不 ...

  2. python中in,not in,比较运算符,格式化输出,编码

    一,python中的in,和not in python中in的作用是检测或查找,例如: c = ‘你好大号胡覅但是啊飞碟说’ b = ‘你好’ print(b in c ) 结果: True c = ...

  3. 一个简单的web.py论坛

    一.概述 forum是一个简单的web.py论坛,后端采用Python+web.py+MySQL,前端采用HTML+CSS+JavaScript+jQuery+RequireJS. 该论坛的主要功能包 ...

  4. JavaScript数组的一些奇葩行为

    今天,复习了一下JavaScript的数组,然后,把他的一些奇葩行为总结了一下,在这里和大家share一下,如果有不对的地方,欢迎指出! 奇葩1:Array()构造器函数可以不使用new关键字进行调用 ...

  5. output.filename 与 output.chunkFilename 的区别

    // webpack.config.js module.exports = { entry: './src/index.js', output: { filename: '[name].bundle. ...

  6. 运行成功的Demo(Python+Appium)

    原文摘自:廖丹  http://www.cnblogs.com/android-it/p/8805659.html 1.打开Appium运行 2.在Pycharm输入代码如下所示: from appi ...

  7. Kafka 基本概念学习笔记

    一. 什么是Kafka 面向数据流的生产,转换,存储,消费的整体流处理平台 二.Kafka三大特性 1.发布和订阅数据的流,类似于消息队列,消息系统 2..数据流存储平台 3.当数据产生的时候,对数据 ...

  8. NET设计模式 第二部分 结构性模式(14):结构型模式专题总结

    ——探索设计模式系列之十五 Terrylee,2006年5月 摘要:结构型模式,顾名思义讨论的是类和对象的结构,它采用继承机制来组合接口或实现(类结构型模式),或者通过组合一些对象,从而实现新的功能( ...

  9. HanLP极致简繁转换详细讲解

    HanLP极致简繁转换详细讲解 作者: hankcs(大快高级研究员 hanlp项目负责人) 谈起简繁转换,许多人以为是小意思,按字转换就行了.事实上,汉语历史悠久,地域复杂,发展至今在字符级别存在“ ...

  10. R基于Bayes理论实现中文人员特性的性别判定

    参见 基于中文人员特征的性别判定方法  理论,告诉一个名字,来猜猜是男是女,多多少少有点算命的味道.此命题是一种有监督的学习方法,从标注好的训练数据学习到一个预测模型,然后对未标注的数据进行预测. 1 ...