属性

  • CurrentContext    获取线程正在其中执行的当前上下文。
  • ExecutionContext    获取 ExecutionContext 对象,该对象包含有关当前线程的各种上下文的信息。
  • CurrentCulture    获取或设置当前线程的区域性。
  • CurrentUICulture    获取或设置资源管理器使用的当前区域性以便在运行时查找区域性特定的资源。
  • CurrentThread    获取当前正在运行的线程。
  • IsAlive    获取指示当前线程的执行状态的值。
  • IsBackground    获取或设置一个值,该值指示某个线程是否为后台线程。
  • IsThreadPoolThread    获取指示线程是否属于托管线程池的值。
  • ManagedThreadId    获取当前托管线程的唯一标识符。
  • Name    获取或设置线程的名称。
  • Priority    获取或设置指示线程的调度优先级的值。
  • ThreadState    获取一个值,该值包含当前线程的状态。

创建和控制线程

Thread 类的构造函数重载为接受ThreadStart和ParameterizedThreadStart类型的委托参数。
ThreadStart委托定义了一个返回类型为void的无参数方法。在创建了 Thread对象后,就可以用Start()方法启动线程:

class Program
{
static void Main()
{
var t1 = new Thread(ThreadMain);
t1.Start();
Console.WriteLine("This is the main thread.");
}
static void ThreadMain()
{
Console.WriteLine("Running in a thread.");
}
}

Lambda表达式还可以与Thread类一起 使用,将线程方法的实现代码传送给Thread构造函数的实参:

static void Main()
{
var t1 = new Thread(() => Console.WriteLine("running in a thread, id: {0}",Thread.CurrentThread.ManagedThreadId));
t1.Start();
Console.WriteLine("This is the main thread, id: {0}",
Thread.CurrentThread.ManagedThreadId);
}

给线程传递参数

给线程传递一些数据可以采用两种方式。

ParameterizedThreadStart委托参数

要给线程传递数据,需要某个存储数据的类或结构。这里定义了包含字符串的Data结构,但可以传递任意对象.

static void Main()
{
var d = new Data { Message = "Info" };
var t2 = new Thread(ThreadMainWithParameters);//ParameterizedThreadStart委托实例
t2.Start(d);
}
static void ThreadMainWithParameters(object o)//如果使用了 ParameterizedThreadStart委托,线程的入口点必须有一个object类型的参数,且返回类型为void。
{
Data d = (Data)o;
Console.WriteLine("Running in a thread, received {0}", d.Message);
}
public struct Data
{
public string Message;
}

创建一个自定义类,把线程的方法定义为实例方法

给新线程传递数据的另一种方式是定义一个类(参见MyThread类),在其中定义需要的字段,将线程的调用的方法定义为类的一个实例方法:

static void Main()
{
var obj = new MyThread("info");
var t3 = new Thread(obj.ThreadMain);//实例方法
t3.Start();
}
//实例方法
public class MyThread
{
private string data;
public MyThread(string data)
{
this.data = data;
}
public void ThreadMain()
{
Console.WriteLine("Running in a thread, data: {0}", data);
}
}

后台线程

只要有一个前台线程在运行,应用程序的进程就在运行。
如果多个前台线程在运行,而Main()方法结束了,应用程序的进程就仍然是激活的,直到所有前台线程完成其任务为止。

在默认情况下,用Thread类创建的线程是前台线程。线程池屮的线程总是后台线程。

在用Thread类创建线程时,可以设置IsBackground属性,以确定该线程是前台线程还是后台线程。

线程的优先级

在Thread类中,可以设置Priority属性,以影响线程的基本优先级。Priority属性需要ThreadPriority 枚举定义的一个值。定义的级别有Highest、AboveNomal、BelowNormal和Lowest。

控制线程

  • 调用Thread对象的Start()方法,可以创建线程。但是,在调用Start()方法后,新线程仍不是处于Running状态,而是处于Unstarted状态。只要操作系统的线程调度器选择了要运行的线程,线程就会改为Running状态。读取Thread.ThreadState属性,就可以获得线程的当前状态。
  • 使用ThreadSleep()方法,会使线程处于WaitSleepJoin状态,在经历Sleep()方法定义的时间段后,线程就会等待再次被唤醒。
  • 要停止另一个线程,可以调用Thread.Abort() 方法。调用这个方法时,会在接到终止命令的线程中抛出一个ThreadAbortExcepticm类型的异常。用一个处理程序捕获这个异常,线程可以在结束前完成一些淸理工作。线程还可以在接收到调用Thread.ResetAbort()方法的结果ThreadAbortExcepdon 异常后继续运行。如果线程没有重置终止,接收到终止请求的线程的状态就从AbortRequested改为 Aborted。
  • 如果需要等待线程的结束,就可以调用Thread.Join()方法。Thread.Join()方法会停止当前线程, 并把它设置为WaitSleepJoin状态,直到加入的线程完成为止。
public class Worker
{
// 此方法将在线程启动时调用。
public void DoWork()
{
while (!_shouldStop)
{
Console.WriteLine("工作线程: working...");
}
Console.WriteLine("工作线程:正常停止");
}
public void RequestStop()
{
_shouldStop = true;
}
// Volatile用于提示编译器这个数据成员将被多个线程访问。
private volatile bool _shouldStop;
} static void Main()
{
// 创建thread对象,但这不会启动线程。
Worker workerObject = new Worker();
Thread workerThread = new Thread(workerObject.DoWork); // 启动工作线程。
workerThread.Start();
Console.WriteLine("main thread: 启动工作线程..."); // 循环,直到工作线程激活。
while (!workerThread.IsAlive) ; // 将主线程休眠1毫秒,让工作线程做一些工作:
Thread.Sleep(1); // 请求工作线程停止自身:
workerObject.RequestStop();//workerObject.Abort() //使用Join方法阻塞当前线程,直到工作线程执行完毕才往下执行
workerThread.Join();
Console.WriteLine("main thread: 工作线程已经终止.");
}

使用线程实现回调

//定义一个委托实现回调函数
public delegate void CallBackDelegate(string message); void Main()
{
//委托实现方法和定义线程
CallBackDelegate cbd = CallBack;
Thread thread = new Thread(initFtpParam);
thread.Start(cbd);
} /// <summary>
/// 线程方法
/// </summary>
/// <param name="obj"></param>
public void initFtpParam(object obj)
{
CallBackDelegate callBackDelegate = obj as CallBackDelegate;
callBackDelegate("aa");//执行委托
} /// <summary>
/// 回调方法
/// </summary>
/// <param name="message"></param>
private void CallBack(string message)
{
Console.Write(message);
}

区域性和线程

  • CurrentUICulture属性可返回当前用户界面区域性。该属性由 ResourceManager 类用于在运行时查找区域性特定资源。
    可以使用非特定区域性、特定区域性或 InvariantCulture 来设置 CurrentUICulture 属性。
    默认值是操作系统用户界面语言。
  • CurrentCulture属性用来决定诸如货币、数字和日期如何格式化。
    CurrentCulture 属性不是一个语言设置。它仅包含与地理区域的标准设置相关的数据。因此,只能将 CurrentCulture 属性设置为特定区域性,比如"fr-FR"或 InvariantCulture。
    默认值是操作系统的User Locale,我们可以在控制面板里设置。CultureInfo.UseUserOverride属性指示是否使用用户在控制面板自定义的 数字、符号、日期、货币等的格式。

1、.NET4.5之前,只能用以下代码只能针对单个线程,如果每次执行线程 都要重新设置一下。。。

新开一个新线程,默认的CurrentCulture为系统的Culture,如果要改变当前线程的Culture,需要在线程中修改 Thread.CurrentCulture值来实现。

m.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");

2、如果使用的.net环境是4.5及以上版本,CultureInfo提供了两个静态属性DefaultThreadCulture和DefaultThreadUICulture,一处修改即可实现所有的未显式设置Thread.CurrentCulture的线程都使用这个Default值。

System.Globalization.CultureInfo.DefaultThreadCurrentCulture = new System.Globalization.CultureInfo("en-US");
System.Globalization.CultureInfo.DefaultThreadCurrentUICulture = new System.Globalization.CultureInfo("en-US");

41、Thead线程 System.Thread与互斥体Mutex的更多相关文章

  1. C#线程学习笔记六:线程同步--信号量和互斥体

    本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/23/Mutex_And_Semaphore.html,记录一下学习过程以备后续查用.     ...

  2. Linux系统中的信号量(semphore)与互斥体(mutex)

    http://www.embexperts.com/viewthread.php?tid=31 两者最大区别:信号量可以允许多个线程进入临界区,而互斥体只允许一个线程进入临界区.本贴将描述信号量与互斥 ...

  3. C#互斥体——Mutex

    Mutex对象是一个同步基元,可以用来做线程间的同步. 若多个线程需要共享一个资源,可以在这些线程中使用Mutex同步基元.当某一个线程占用Mutex对象时,其他也需要占用Mutex的线程将处于挂起状 ...

  4. Windbg调试互斥体(Mutex)死锁

    一. 测试代码 #include <windows.h> #include <tchar.h> #include <process.h> HANDLE hMutex ...

  5. 线程同步方式之互斥量Mutex

    互斥量和临界区非常相似,只有拥有了互斥对象的线程才可以访问共享资源,而互斥对象只有一个,因此可以保证同一时刻有且仅有一个线程可以访问共享资源,达到线程同步的目的. 互斥量相对于临界区更为高级,可以对互 ...

  6. Linux的线程同步对象:互斥量Mutex,读写锁,条件变量

        进程是Linux资源分配的对象,Linux会为进程分配虚拟内存(4G)和文件句柄等 资源,是一个静态的概念.线程是CPU调度的对象,是一个动态的概念.一个进程之中至少包含有一个或者多个线程.这 ...

  7. windows系统调用 互斥体mutex

    #include "iostream" #include "windows.h" using namespace std; class CCountUpDown ...

  8. 基元线程同步构造之 Mutes(互斥体)

    互斥体实现了“互相排斥”(mutual exclusion)同步的简单形式(所以名为互斥体(mutex)). 互斥体禁止多个线程同时进入受保护的代码“临界区”(critical section). 因 ...

  9. boost 线程、互斥体、条件变量

    1.任何技术都是针对特定场景设计的,也就是说,为了解决某个问题而设计的. 2.考虑下面一种场景:一个小旅馆,只有一个卫生间,有清洁人员,店主人,和旅客.卫生间用完之后,就会自动锁闭,必须取钥匙,才能进 ...

随机推荐

  1. jstack 结果查看

    首先可以用jstack -l pid >sample.dump把java进程的运行栈dump出来. 还可以用grep java.lang.Thread.State sample.dump | a ...

  2. Lenovo笔记本Fn的总结

    Fn与其他按键结合使用以访问特殊的ThinkPad功能. Fn+F2  锁定计算机 Fn+F3 管理电池和电源 Fn+F4 进入睡眠(待机)模式 Fn+F5 管理无线连接 Fn+F6 打印屏幕 Fn+ ...

  3. MySQL字符串函数:字符串截取

    MySQL 字符串截取函数:left(), right(), substring(), substring_index().还有 mid(), substr().其中,mid(), substr() ...

  4. WCF Data Services 5.0 for OData V3

    https://www.microsoft.com/en-us/download/details.aspx?id=29306 VS 2010 下 安装 WCF Data Services 5.0 en ...

  5. PL/SQL之游标的使用

    Oracle中的游标有两种: 显式游标 用CURSOR...IS 命令定义的游标,它可以对查询语句(SELECT)返回的多条记录进行处理. 隐式游标 是在执行插入(INSERT).删除(DELETE) ...

  6. RabbitMQ---6、客户端 API 的简介

    1.主要的命名空间,接口和类 定义核心的API的接口和类被定义在RabbitMQ.Client这个命名空间下面: 所以要想使用RabbitMQ的功能,需要以下代码     using RabbitMQ ...

  7. 1、类、封装(私有private、this关键字)

    类与对象 对象在需求中的使用 ​ 对面向对象有了了解之后,我们来说说在具体问题中如何使用面向对象去分析问题,和如何使用面向对象. ​ 我们把大象装冰箱为例进行分析. ​ 在针对具体的需求,可以使用名词 ...

  8. 撩课-Java每天5道面试题第10天

    撩课Java+系统架构 视频 点击开始学习 81.Servlet的会话机制? HTTP 是一种无状态协议, 这意味着每次客户端检索网页时, 都要单独打开一个服务器连接, 因此服务器不会记录下 先前客户 ...

  9. xshell 中解决中文乱码问题

    点击菜单栏 文件 -> 属性 在属性对话框内点击终端, 选择 编码为 UTF-8 即可.

  10. yum只下载不安装dokcer

    yum install --downloadonly --downloaddir=/test/ docker-io 有三个依赖包,如果不知道现后依赖顺序,可以强制安装 哦了