前台线程和后台线程
概念
线程的优先级
控制线程
1.获取线程状态
2.终止线程
线程池发起线程
线程池执行的都是后台线程
线程池只能用于时间比较短的任务
namespace ConsoleApp1
{
class Program
{
static void ThreadMethod(object state)
{
Console.WriteLine("线程开始"+Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
Console.WriteLine("线程结束");
}
static void Main(string[] args)
{
//线程池创建后台线程
ThreadPool.QueueUserWorkItem(ThreadMethod);
ThreadPool.QueueUserWorkItem(ThreadMethod);
ThreadPool.QueueUserWorkItem(ThreadMethod);
ThreadPool.QueueUserWorkItem(ThreadMethod);
ThreadPool.QueueUserWorkItem(ThreadMethod);
ThreadPool.QueueUserWorkItem(ThreadMethod);
ThreadPool.QueueUserWorkItem(ThreadMethod);
ThreadPool.QueueUserWorkItem(ThreadMethod);
Console.ReadKey();
}
}
}
通过任务开启线程
namespace ConsoleApp1
{
class Program
{
static void ThreadMethod()
{
Console.WriteLine("任务开始"+Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
Console.WriteLine("任务结束");
}
static void Main(string[] args)
{ //1.Task开启任务
//传递一个需要线程去执行的方法
// Task task = new Task(ThreadMethod);
//task.Start();
//2.TaskFactory创建
//TaskFactory tf=new TaskFactory();
//Task t=tf.StartNew(ThreadMehtod);
Console.WriteLine("main");
Console.ReadKey();
}
}
}
任务的层次结构
父任务等待子任务执行完成才完成
线程争用和死锁
模拟线程争用
using System.Threading;
using System.Threading.Tasks;
//模拟线程争用
namespace ConsoleApp1
{
class Program
{
//模拟线程争用
static void ChangStateMain(object o)
{
MyThreadObject m = o as MyThreadObject;
while(true)
{
m.ChangState();
}
}
static void Main(string[] args)
{
MyThreadObject m = new MyThreadObject();
new Thread(ChangStateMain).Start(m);
new Thread(ChangStateMain).Start(m);
Console.WriteLine("main");
Console.ReadKey();
}
}
}
MyThreadObject
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class MyThreadObject
{
private int state = 5;
public void ChangState()
{
state++;
if(state==5)
{
Console.WriteLine("state=5");
}
state = 5;
}
}
}
加锁
using System.Threading;
using System.Threading.Tasks;
//模拟线程争用
namespace ConsoleApp1
{
class Program
{
//模拟线程争用
static void ChangStateMain(object o)
{
MyThreadObject m = o as MyThreadObject;
while(true)
{
//向系统申请可不可以锁定m对象,如果m对象没有被锁定,那么可以
//如果m对象已经被锁定,则该语句会暂停
//同一时刻只有一个线程在执行该发方法
lock(m)
{
m.ChangState();
}//释放对m的锁定
}
}
static void Main(string[] args)
{
MyThreadObject m = new MyThreadObject();
new Thread(ChangStateMain).Start(m);
new Thread(ChangStateMain).Start(m);
Console.WriteLine("main");
Console.ReadKey();
}
}
}
死锁
编程开始之前设定好锁定的顺序