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.若以上两个线程都设置为后台线程,则获得以下输出