【C#知识点】线程

1.线程是什么?

线程是获得处理器时间片的一次运行过程,若有多个线程任务,单核心计算机只能并发执行线程,即感官上的同时运行,而在多核心计算机中能够够并行执行线程,即物理意义上的同时运行。

2.如何创建线程

1.创建线程:

var newThread = new Thread(SayHello);

2.执行线程:

newThread.Start();

3.示例:

	static void Main(string[] args)
	{
	    var newThread = new Thread(SayHello);
	    newThread.Start();
	}
	
	/// <summary>
	/// 打招呼
	/// </summary>
	private static void SayHello()
	{
	   Console.WriteLine("Hello!");
	}

输出:
在这里插入图片描述

3.如何区分当前线程

Thread.CurrentThread.ManagedThreadId

示例:

	static void Main(string[] args)
	{
	    LogCurrentThreadId();
	    
	    var newThread = new Thread(LogCurrentThreadId);
	    newThread.Start();
	}
	
	/// <summary>
	/// 打印当前线程id
	/// </summary>
	private static void LogCurrentThreadId()
	{
	    Console.WriteLine("当前线程id【{0}】",Thread.CurrentThread.ManagedThreadId);
	}

输出:
在这里插入图片描述

4.什么是阻塞?

即交出运行权力的行为,如等待5000毫秒。

5.前台线程和后台线程有什么区别?

前台线程会阻止应用程序的退出,当直到前台线程运行结束,后台线程会在所有前台线程运行结束后,被自动终止。

1.判断是否为前台线程,利用线程对象的以下属性

IsBackground

2.示例1,不设置前后台情况下,线程为前台线程:

	static void Main(string[] args)
	{
	    Console.WriteLine("主线程【{0}】,开始执行",GetCurrentThreadId());
	    
	    var newThread1 = new Thread(LogRunningState);
	    var newThread2 = new Thread(LogRunningState);
	    
	    newThread1.Start();
	    newThread2.Start();
	    
	    Console.WriteLine("主线程【{0}】,执行完毕",GetCurrentThreadId());
	}
	
	/// <summary>
	/// 打印运行状态
	/// </summary>
	private static void LogRunningState()
	{
	    Console.WriteLine("线程【{0}】开始执行",GetCurrentThreadId());
	    Thread.Sleep(100);
	    Console.WriteLine("线程【{0}】执行完毕",GetCurrentThreadId());
	}
	
	/// <summary>
	/// 获取当前线程id
	/// </summary>
	private static int GetCurrentThreadId()
	{
	    return Thread.CurrentThread.ManagedThreadId;
	}

输出:
在这里插入图片描述
3. 示例2:指定一个为前台线程,一个为后台线程

	static void Main(string[] args)
	{
	    Console.WriteLine("主线程【{0}】,开始执行",GetCurrentThreadId());
	    
	    var newThread1 = new Thread(()=>
	    {
	        LogRunningState(500);
	    });
	    var newThread2 = new Thread(() =>
	    {
	        LogRunningState(100);
	    });
	    
	    newThread1.IsBackground = true;
	    newThread2.IsBackground = false;
	    
	    newThread1.Start();
	    newThread2.Start();
	    
	    Console.WriteLine("主线程【{0}】,执行完毕",GetCurrentThreadId());
	}
	
	/// <summary>
	/// 打印运行状态
	/// </summary>
	/// <param name="sleepTime">等待时间</param>
	private static void LogRunningState(int sleepTime)
	{
	    var threadTag = Thread.CurrentThread.IsBackground ? "后台线程" : "前台线程";
	    var threadId = Thread.CurrentThread.ManagedThreadId;
	    
	    Console.WriteLine("【{0}】线程【{1}】开始执行",threadTag,threadId);
	    Thread.Sleep(sleepTime);
	    Console.WriteLine("【{0}】线程【{1}】执行完毕",threadTag,threadId);
	}
	
	/// <summary>
	/// 获取当前线程id
	/// </summary>
	private static int GetCurrentThreadId()
	{
	    return Thread.CurrentThread.ManagedThreadId;
	}

输出:
在这里插入图片描述
若此时阻塞前台线程,则会看到程序未退出,且后台线程也执行完毕了

/// <summary>
/// 打印运行状态
/// </summary>
/// <param name="sleepTime">等待时间</param>
private static void LogRunningState(int sleepTime)
{
    var threadTag = Thread.CurrentThread.IsBackground ? "后台线程" : "前台线程";
    var threadId = Thread.CurrentThread.ManagedThreadId;
    
    Console.WriteLine("【{0}】线程【{1}】开始执行",threadTag,threadId);
    Thread.Sleep(sleepTime);
    Console.WriteLine("【{0}】线程【{1}】执行完毕",threadTag,threadId);

    if (!Thread.CurrentThread.IsBackground)
    {
        Console.WriteLine("阻塞-->【{0}】线程【{1}】",threadTag,threadId);
        Console.ReadLine();
    }
}

输出:
在这里插入图片描述

4.若以上两个线程都设置为后台线程,则获得以下输出

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值