C#多线程学习(二)如何操纵一个线程

下面我们就动手来创建一个线程,使用Thread类创建线程时,只需提供线程入口即可。(线程入口使程序知道该让这个线程干什么事)

在C#中,线程入口是通过ThreadStart代理(delegate)来提供的,你可以把ThreadStart理解为一个函数指针,指向线程要执行的函数,当调用Thread.Start()方法后,线程就开始执行ThreadStart所代表或者说指向的函数。

打开你的VS.net,新建一个控制台应用程序(Console Application),编写完全控制一个线程的代码示例:

//ThreadTest.cs
using System;
using System.Threading;
namespace ThreadTest
{
   public class Alpha
   {
       public void Beta()
       {
         while (true)
         {
           Console.WriteLine("Alpha.Beta is running in its own thread.");
         }
       }
   };
  public class Simple
   {
       public static int Main()
       {
         Console.WriteLine("Thread Start/Stop/Join Sample");
Alpha oAlpha = new Alpha();
         file://这里创建一个线程,使之执行Alpha类的Beta()方法
         Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));
         oThread.Start();
         while (!oThread.IsAlive)
         Thread.Sleep(1);
         oThread.Abort();
         oThread.Join();
         Console.WriteLine();
         Console.WriteLine("Alpha.Beta has finished");
         try
         {
           Console.WriteLine("Try to restart the Alpha.Beta thread");
           oThread.Start();
         }
         catch (ThreadStateException)
         {
           Console.Write("ThreadStateException trying to restart Alpha.Beta. ");
           Console.WriteLine("Expected since aborted threads cannot be restarted.");
           Console.ReadLine();
         }
         return 0;
       }
   }
}

这段程序包含两个类Alpha和Simple,在创建线程oThread时我们用指向Alpha.Beta()方法的初始化了ThreadStart代理(delegate)对象,当我们创建的线程oThread调用oThread.Start()方法启动时,实际上程序运行的是Alpha.Beta()方法:

Alpha oAlpha = new Alpha();

Thread oThread = new Thread(new ThreadStart(oAlpha.Beta));

oThread.Start();

然后在Main()函数的while循环中,我们使用静态方法Thread.Sleep()让主线程停了1ms,这段时间CPU转向执行线程oThread。然后我们试图用Thread.Abort()方法终止线程oThread,注意后面的oThread.Join(),Thread.Join()方法使主线程等待,直到oThread线程结束。你可以给Thread.Join()方法指定一个int型的参数作为等待的最长时间。之后,我们试图用Thread.Start()方法重新启动线程oThread,但是显然Abort()方法带来的后果是不可恢复的终止线程,所以最后程序会抛出ThreadStateException异常。

时间: 2024-09-28 13:21:51

C#多线程学习(二)如何操纵一个线程的相关文章

线程执行者(二)创建一个线程执行者

创建一个线程执行者 使用Executor framework的第一步就是创建一个ThreadPoolExecutor类的对象.你可以使用这个类提供的4个构造器或Executors工厂类来 创建ThreadPoolExecutor.一旦有执行者,你就可以提交Runnable或Callable对象给执行者来执行. 在这个指南中,你将会学习如何使用这两种操作来实现一个web服务器的示例,这个web服务器用来处理各种客户端请求. 准备工作 你应该事先阅读第1章中创建和运行线程的指南,了解Java中线程创

linux多线程学习(二)——线程的创建和退出

      在上一篇文章中对线程进行了简单的概述,它在系统中和编程的应用中,扮演的角色是不言而喻的.学习它.掌握它.吃透它是作为一个程序员的必须作为.在接下来的讲述中,所有线程的操作都是用户级的操作.在LINUX中,一般pthread线程库是一套通用的线程库,是由POSIX提出的,因此他的移植性是非常好的.       创建线程实际上就是确定调用该线程函数的入口点,这里通常使用的函数是pthread_create.在线程创建之后,就开始运行相关的线程函数.在该函数运行结束,线程也会随着退出.这是

多线程socket中,每一个线程用异步后,出现的问题

问题描述 开始我为了接收多个端口收到的UDP包数据,我创建了多个线程,但当UDP包发送很快时,接收就会丢包,后来我在多个线程中用了异步的方法,如下代码所示,多线程执行StartListening()方法,在StartListening()方法中执行了ReadCallback(IAsyncResultar),可是我发现,在我跟踪到ReadCallback(IAsyncResultar)中时,发现只有一个ReadCallback线程(从vs2005开发环境中的线程监视中看到的),难道多个线程执行St

艾伟:C#多线程学习(四) 多线程的自动管理(线程池)

本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习(五) 多线程的自动管理(定时器) C#多线程学习(六) 互斥对象 在多线程的程序中,经常会出现两种情况: 一种情况: 应用程序中,线程把大部分的时间花费在等待状态,等待某个事件发生,然后才能给予响应 这一般使用ThreadPool(线程池)来解决: 另一种情况:线程平时都处于休眠状态,只是周期性地被

艾伟:C#多线程学习(五) 多线程的自动管理(定时器)

本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习(五) 多线程的自动管理(定时器) C#多线程学习(六) 互斥对象 Timer类:设置一个定时器,定时执行用户指定的函数. 定时器启动后,系统将自动建立一个新的线程,执行用户指定的函数. 初始化一个Timer对象: Timer timer = new Timer(timerDelegate, s,10

多线程-C++怎么在一个进程里创建一个线程

问题描述 C++怎么在一个进程里创建一个线程 大家好,我用CreateProcess创建了一个进程,进程的句柄可以获取到, 请问能否通过此句柄创建一个此进程的子线程? 如果可以,如何实现? 多谢. 解决方案 createremotethread apihttp://blog.163.com/lhc__721721/blog/static/639133252010622359175/ 解决方案二: 创建一个线程创建一个线程vc创建一个线程和销毁的方法 解决方案三: 在程序中创建另一个进程的线程,要

当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法(转)

对象的synchronized方法不能进入了,但它的其他非synchronized方法还是可以访问的 对每一个class只有一个thread可以执行synchronized static method.每个class的instance只有一个thread可以执行synchronized method.任意数目的thread可以执行非synchronized method--不管是否是static.   情况一: 当一个线程进入一个对象的一个synchronized方法后,其它线程访问该对象的非同

多线程-使用多个线程池还是一个线程池

问题描述 使用多个线程池还是一个线程池 最近在技术理论上遇到一个问题,不知道怎么解决. 问题描述:我们交易平台有4个商品(A.B.C.D)需要进行现在交易,交易的核心方法dealorder是 一个加了锁和事务的方法,而且该类是针对每一个商品的,即最多同时可以执行4个dealOrder方法,即每个商品执行一个该方法. @Transactional public synchronized Message dealOrder() CPU核心数是固定的,假如为6核心,目前就存在一个问题, 情况1:假如说

MFC多线程程序如果一个线程报错

问题描述 MFC多线程程序如果一个线程报错 MFC多线程程序如果一个线程报错,关闭这个线程,然后重新执行这个线程,不丢失数据怎么做? 解决方案 每执行一个,就把数据保存到文件中,然后恢复的时候从文件读取. 解决方案二: 没办法 线程强制结束 数据就都丢失了