1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading;
  6.  
  7. namespace ThreadTest
  8. {
  9. class Program
  10. {
  11. static void DoWork()
  12. {
  13. Console.WriteLine("DoWork is begin");
  14.  
  15. for (int i = ; i < ; i++)
  16. {
  17. try
  18. {
  19. if (i == )
  20. {
  21. //终止线程,会抛出一个ThreadAbortException 类型的异常
  22. Thread.CurrentThread.Abort(i);
  23. }
  24.  
  25. Console.WriteLine(string.Format("{0} {1}", Thread.CurrentThread.Name, i));
  26. Thread.Sleep();
  27. }
  28. catch (ThreadAbortException e)
  29. {
  30. Console.WriteLine(string.Format("{0} is Abort when i is {1}", Thread.CurrentThread.Name, e.ExceptionState));
  31.  
  32. //取消终止,静态方法
  33. Thread.ResetAbort();
  34. }
  35.  
  36. }
  37.  
  38. Console.WriteLine("DoWork is end");
  39. }
  40.  
  41. /// <summary>
  42. ///
  43. /// </summary>
  44. /// <param name="args"></param>
  45. static void Main(string[] args)
  46. {
  47. Console.WriteLine("Main thread begin");
  48.  
  49. #region Thread类构造函数的参数是:不带参数的静态方法
  50.  
  51. Thread myThread1 = new Thread(Program.DoWork);
  52. myThread1.Name = "thread1";
  53.  
  54. /*
  55. * 有关前台线程和后台线程
  56. * 线程Thread有一个属性IsBackground,通过把此属性设置为true,就可以把线程设置为后台线程!
  57. * 当一个进程除了主线程之外其他线程都是后台线程时,应用程序域将在主线程完成时就被卸载,而不会等待异步线程的运行。
  58. * 使用Thread.Start()启动的线程默认为前台线程,而系统必须等待所有前台线程运行结束后,应用程序域才会自动卸载。
  59. */
  60.  
  61. //设置为后台线程
  62. myThread1.IsBackground = true;
  63.  
  64. myThread1.Start();
  65.  
  66. #endregion
  67.  
  68. #region Thread类构造函数的参数是:带参数的非静态方法
  69.  
  70. string str = string.Format("test");
  71. Test myTest = new Test();
  72.  
  73. //如果Thread的构造函数的参数是带参数的方法,则这个参数要求是object类型
  74. Thread myThread2 = new Thread(myTest.ShowMessage);
  75. myThread2.Name = "thread2";
  76.  
  77. //设置为前台线程,默认为前台线程
  78. myThread2.IsBackground = false;
  79.  
  80. myThread2.Start(str);
  81.  
  82. /*
  83. * thread线程间的同步:join方法
  84. *
  85. * 关于对 Thread类实例的Join方法的理解.
  86. * 两个线程的关系如下:一个线程(旧的)生成并启动另一个线程(新的).
  87. * join方法只能在以下条件被调用:一个新的线程被创建并且调用start方法后.
  88. * join方法的作用:阻塞。在旧的线程代码里,运行到行新线程实例的join方法时,旧线程将会被阻塞,
  89. * 直到新线程(不管是前台还是后台线程)执行完成后,旧线程才会继续执行join方法后面的代码。
  90. *
  91. * 比喻如下:线程A创建了线程B和线程C并且都调用start方法启动了线程B和C,线程A才能调用线程B和C的join方法,
  92. * 表示线程A将阻塞等到线程B和C执行完之后再继续执行。但线程B和C之间是不用通过join方法来通信或者同步的。
  93. *
  94. * 在本例里,main线程是主线程,创建线程myThread1和myThread2并都启动了,在执行到myThread2.Join();代码时,
  95. * 主线程main线程将被阻塞,直到myThread2线程执行完之后,再继续执行
  96. *
  97. */
  98.  
  99. myThread2.Join();
  100.  
  101. #endregion
  102.  
  103. //其他:Suspend 与 Resume 方法分别表示挂起和恢复线程,已过时,微软不建议继续使用,不做介绍。
  104.  
  105. Console.WriteLine("Main thread end");
  106. Thread.Sleep();
  107. // Console.ReadKey();
  108. }
  109.  
  110. }
  111.  
  112. class Test
  113. {
  114. //要作为Thread的构造函数的参数,则这个参数要求是object类型
  115. public void ShowMessage(object obj)
  116. {
  117. Console.WriteLine("ShowMessage is begin");
  118.  
  119. string str = obj as string;
  120. for (int i = ; i < ; i++)
  121. {
  122. Console.WriteLine(string.Format("{0} {1}{2}", Thread.CurrentThread.Name,str, i));
  123. Thread.Sleep();
  124. }
  125.  
  126. Console.WriteLine("ShowMessage is end");
  127. }
  128. }
  129. }

C#多线程学习之Thread的更多相关文章

  1. java多线程学习

    在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 一.扩展java.lang.Thread类 package com.multithread.lea ...

  2. Java多线程学习(吐血超详细总结)

    本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的 ...

  3. Java多线程学习(转载)

    Java多线程学习(转载) 时间:2015-03-14 13:53:14      阅读:137413      评论:4      收藏:3      [点我收藏+] 转载 :http://blog ...

  4. [转]Java多线程学习(吐血超详细总结)

    转自:http://www.mamicode.com/info-detail-517008.html 本文主要讲了Java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法. ...

  5. Java多线程学习---------超详细总结(java 多线程 同步 数据传递 )

    目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么 ...

  6. 多线程学习-基础(一)Thread和Runnable实现多线程

    很久没记录一些技术学习过程了,这周周五的时候偶尔打开“博客园”,忽然让我产生一种重拾记录学习过程的想法,记录下学习研究过程的一点一滴,我相信,慢慢地就进步了!最近想学习一下多线程高并发,但是多线程在实 ...

  7. JUC学习笔记--Thread多线程基础

    实现多线程的两种方法 java 实现多线程通过两种方式1.继承Thread类 ,2.实现Runnable接口 class Newthead extends Thread{ public void ru ...

  8. Java多线程学习笔记

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

  9. 【转】C#多线程学习

    C#多线程学习(一) 多线程的相关概念 什么是进程?当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程?线程是程序 ...

随机推荐

  1. iOS-tableview【终极方案】精准获取webView内容高度,自适应高度

    关于WebView内容高度的获取,相信很多人都踩过坑,无法获取到准确高度,导致页面布局出现差错,搜到的资料很多但都无法解决问题,以下是个人经验总结: 项目需求实现H5文章&原生评论效果,文章是 ...

  2. 微信小程序结构分析

    1.Console页面:控制台信息页两个作用: (1)开发直接输入代码并且进行调试: (2)显示小程序的错误输出: 2.Sources页面:源文件调试信息页,用于显示当前项目的脚本文件. 3.Netw ...

  3. 如何停止和扭转UIView的动画

    本文转载至  http://codego.net/576089/ 我有它收缩时碰到切换按钮UIView的动画跳和它扩展恢复到原来的大小当再次接触到按钮.密封式前大灯一切都工作得很好.问题是,动画师注意 ...

  4. [转]JavaWeb之 Servlet执行过程 与 生命周期

    https://www.cnblogs.com/vmax-tam/p/4122105.html Servlet的概念 什么是Servlet呢? Java中有一个叫Servlet的接口,如果一个普通的类 ...

  5. uva 12730(期望经典)

    选自: http://blog.csdn.net/myhelperisme/article/details/39724515 用dp(n)表示有n个位置时的期望值,那么,对于一个刚进来的人来说,他有 ...

  6. 前台传递给后台的JSON字符串中的引号 “” 在JAVA后台被转义为 "

    前台传递给后台的JSON字符串中的引号 "" 在JAVA后台被转义为 &quot 1.问题: 前台数据,JSON字符串带有引号 "" ,数据被传递到后台 ...

  7. leetcode第一刷_Rotate Image

    这个题该怎么说呢.旋转又要求inplace.一般就是要找到某种规律了.这个还是非常明显的,画一下原来的.再画一下旋转之后的.看看原来的跑到什么位置了. 牵扯到四个位置按顺时针方向互换一下位置,发现仅仅 ...

  8. Latex排版全解(转)

    Latex排版全解 http://blog.csdn.net/langb2014/article/details/51354238

  9. Latex技巧:在图表序号中加入章节号(实现诸如“图1.1.2”这样的图表序号)

    平时看书经常看到"图1.2"这样的编号,含义是第1章的第2幅插图:或者"图1.1.2",含义是第1章第1节的第2幅插图.而在LaTeX中如果直接插图的话只会显示 ...

  10. boost之正则表达式

    正则表示主要用于查找一系列符合规则的对象,而我们之前的查找是对某一特定的字符串进行查找. #include <iostream> #include <vector> #incl ...