.NET多线程编程(6)——如何操纵一个线程

简介:
  下面我们就动手来创建个线程使用Thread类创建线程时只需提供线程入口即可(线程入口使知道该让这个线程干什么事)
  在C#中线程入口是通过ThreadStart代理(delegate)来提供你可以把ThreadStart理解为个指针指向线程要执行当Thread.Start思路方法后线程就开始执行ThreadStart所代表或者说指向
  打开你VS.net新建个控制台应用(Console Application)编写完全控制个线程代码举例:
//ThreadTest.cs
using;
using.Threading;
ThreadTest
{
  publicAlpha
  {
      publicvoidBeta
      {
        while(true)
        {
          Console.WriteLine("Alpha.Betaisrunninginitsownthread.");
        }
      }
  };
  publicSimple
  {
      publicMain
      {
        Console.WriteLine("ThreadStart/Stop/JoinSample");
        AlphaoAlpha=Alpha;
        file://这里创建个线程使的执行Alpha类Beta思路方法
        ThreadoThread=Thread(ThreadStart(oAlpha.Beta));
        oThread.Start;
        while(!oThread.IsAlive)
           Thread.Sleep(1);
        oThread.Abort;
        oThread.Join;
        Console.WriteLine;
        Console.WriteLine("Alpha.Betahasfinished");
        try
        {
          Console.WriteLine("TrytorestarttheAlpha.Betathread");
          oThread.Start;
        }
        catch(ThreadStateException)
        {
          Console.Write("ThreadStateExceptiontryingtorestartAlpha.Beta.");
          Console.WriteLine("Expectedsinceabortedthreadscannotberestarted.");
          Console.ReadLine;
        }
        0;
      }
  }
}
  这段包含两个类Alpha和Simple在创建线程oThread时我们用指向Alpha.Beta思路方法化了
ThreadStart代理(delegate)对象当我们创建线程oThreadoThread.Start思路方法启动时实际上运行是
Alpha.Beta思路方法:
  Alpha oAlpha = Alpha;
  Thread oThread = Thread( ThreadStart(oAlpha.Beta));
  oThread.Start;
  然后在Mainwhile循环中我们使用静态思路方法Thread.Sleep让主线程停了1ms这段时间CPU转向执行线
程oThread然后我们试图用Thread.Abort思路方法终止线程oThread注意后面oThread.JoinThread.Join思路
方法使主线程等待直到oThread线程结束你可以给Thread.Join思路方法指定个型参数作为等待最长时间的后我
们试图用Thread.Start思路方法重新启动线程oThread但是显然Abort思路方法带来后果是不可恢复终止线程所
以最后会抛出ThreadStateException异常
  主线程Main
  所有线程都是依附于Main所在线程Main是C#入口起始线程可以称的为主线程
  如果所有前台线程都停止了那么主线程可以终止而所有后台线程都将无条件终止
  所有线程虽然在微观上是串行执行但是在宏观上你完全可以认为它们在并行执行
  Thread.ThreadState 属性
  这个属性代表了线程运行时状态在区别情况下有区别值我们有时候可以通过对该值判断来设计流程
  ThreadState 属性取值如下:
  Aborted:线程已停止;
  AbortRequested:线程Thread.Abort思路方法已被但是线程还未停止;
  Background:线程在后台执行和属性Thread.IsBackground有关;
  Running:线程正在正常运行;
  Stopped:线程已经被停止;
  StopRequested:线程正在被要求停止;
  Suspended:线程已经被挂起(此状态下可以通过Resume思路方法重新运行);
  SuspendRequested:线程正在要求被挂起但是未来得及响应;
  Unstarted:未Thread.Start开始线程运行;
  WaitSleepJoin:线程了Wait,Sleep或Join等思路方法处于封锁状态;
  上面提到了Background状态表示该线程在后台运行那么后台运行线程有什么特别地方呢?其实后台线程
跟前台线程只有个区别那就是后台线程不妨碍终止旦个进程所有前台线程都终止后CLR(通用语言运行环境)将通
过任意个存活中后台进程Abort思路方法来彻底终止进程
  线程优先级
  当线程的间争夺CPU时间时CPU 是按照线程优先级给予服务在C#应用中用户可以设定5个区别优先级由高
到低分别是HighestAboveNormalNormalBelowNormalLowest在创建线程时如果不指定优先级那么系统默
认为ThreadPriority.Normal
  给个线程指定优先级我们可以使用如下代码:
  //设定优先级为最低
  myThread.Priority=ThreadPriority.Lowest;
  通过设定线程优先级我们可以安排些相对重要线程优先执行例如对用户响应等等




本文转自 qianshao 51CTO博客,原文链接:http://blog.51cto.com/qianshao/203203,如需转载请自行联系原作者

目录
相关文章
|
16天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
13 3
|
16天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
13 2
|
16天前
|
Java
Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口
【10月更文挑战第20天】《JAVA多线程深度解析:线程的创建之路》介绍了Java中多线程编程的基本概念和创建线程的两种主要方式:继承Thread类和实现Runnable接口。文章详细讲解了每种方式的实现方法、优缺点及适用场景,帮助读者更好地理解和掌握多线程编程技术,为复杂任务的高效处理奠定基础。
27 2
|
16天前
|
Java
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。
在Java多线程编程中,`wait()` 和 `notify()/notifyAll()` 方法是线程间通信的核心机制。它们通过基于锁的方式,使线程在条件不满足时进入休眠状态,并在条件成立时被唤醒,从而有效解决数据一致性和同步问题。本文通过对比其他通信机制,展示了 `wait()` 和 `notify()` 的优势,并通过生产者-消费者模型的示例代码,详细说明了其使用方法和重要性。
21 1
|
24天前
|
监控 安全 算法
线程死循环确实是多线程编程中的一个常见问题,在编码阶段规避潜在风险
【10月更文挑战第12天】线程死循环确实是多线程编程中的一个常见问题,在编码阶段规避潜在风险
41 2
|
2月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
25天前
|
监控 安全 算法
线程死循环确实是多线程编程中的一个常见问题,它可能导致应用程序性能下降,甚至使整个系统变得不稳定。
线程死循环是多线程编程中常见的问题,可能导致性能下降或系统不稳定。通过代码审查、静态分析、日志监控、设置超时、使用锁机制、测试、选择线程安全的数据结构、限制线程数、使用现代并发库及培训,可有效预防和解决死循环问题。
42 1
|
30天前
|
监控 安全 算法
线程死循环是多线程编程中的常见问题,可能导致应用性能下降甚至系统不稳定。
【10月更文挑战第6天】线程死循环是多线程编程中的常见问题,可能导致应用性能下降甚至系统不稳定。为了解决这一问题,可以通过代码审查、静态分析、添加日志监控、设置超时机制、使用锁和同步机制、进行全面测试、选用线程安全的数据结构、限制线程数量、利用现代并发库,并对团队进行培训等方法来预防和减少死循环的发生。尽管如此,多线程编程的复杂性仍需要持续监控和维护以确保系统稳定。
49 3
|
1月前
|
安全 Java 开发者
在多线程编程中,确保数据一致性与防止竞态条件至关重要。Java提供了多种线程同步机制
【10月更文挑战第3天】在多线程编程中,确保数据一致性与防止竞态条件至关重要。Java提供了多种线程同步机制,如`synchronized`关键字、`Lock`接口及其实现类(如`ReentrantLock`),还有原子变量(如`AtomicInteger`)。这些工具可以帮助开发者避免数据不一致、死锁和活锁等问题。通过合理选择和使用这些机制,可以有效管理并发,确保程序稳定运行。例如,`synchronized`可确保同一时间只有一个线程访问共享资源;`Lock`提供更灵活的锁定方式;原子变量则利用硬件指令实现无锁操作。
19 2
|
2月前
|
存储 Ubuntu Linux
C语言 多线程编程(1) 初识线程和条件变量
本文档详细介绍了多线程的概念、相关命令及线程的操作方法。首先解释了线程的定义及其与进程的关系,接着对比了线程与进程的区别。随后介绍了如何在 Linux 系统中使用 `pidstat`、`top` 和 `ps` 命令查看线程信息。文档还探讨了多进程和多线程模式各自的优缺点及适用场景,并详细讲解了如何使用 POSIX 线程库创建、退出、等待和取消线程。此外,还介绍了线程分离的概念和方法,并提供了多个示例代码帮助理解。最后,深入探讨了线程间的通讯机制、互斥锁和条件变量的使用,通过具体示例展示了如何实现生产者与消费者的同步模型。