文章目录
1.多线程技术介绍
作用
1.实现多任务
2.解决延迟
应用
计算量比较大的场景下,计算时长比较久的业务,比如英雄联盟中的战争迷雾,它要算很多可视化和迷雾的单位,需要独立的线程来进行计算
在LOL中,每个正在战斗的房间,底层也是要求互相独立,可并行的.所以也需要多线程的支持.
每次打开王者荣耀,要更新很多内容对不对,如果不使用多线程下载更新,那么速度会更慢
....
线程Thread .net4.0(.net4.0之前的多线程方式)
任务Task .4.0之后(Task是.net4.0之后对Thread的封装)
线程同步
2.Thread线程的创建、启动、阻塞
线程Thread .net4.0
创建线程
构建Thread实例 参数需要指定一个方法
通过Start方法开始执行线程
如果需要给方法传递参数 则使用匿名函数...
如果有返回值怎么办
定义变量 进行接收
暂停线程
通过Thread实例调用Join,可以阻止其他线程的调用,直到由该实例表示的线程终止
线程实例 .Join();
可以给与传递一个参数 表示最长阻塞多长时间 单位毫秒
计时等待
Thread.Sleep() 让线程休眠一段时间
通过静态方法 可以让当前的线程等待一定的时间 由参数决定等待的时间 单位毫秒
它只影响当前执行的线程,其他线程的依旧会执行
中止线程
thread.Abort();
该方法中止方式是对线程进行销毁,它适用于当程序要关闭的时候进行调度,能够保证线程程序关闭,线程也被销毁.
其他地方尽可能不要用,有其他方式,比如用在线程内部用了lock语句,那么强制关闭线程将会导致lock失效,从而有可能影响计算结果.
通过信号控制线程
ManualResetEvent
检测线程状态
thread.ThreadState
前台线程和后台线程
后台线程:程序停止后 可能还会继续执行
软件开发
前台线程:程序停止 都会停止掉所有前台线程 线程默认都是前台线程
访问当前线程ID:
Thread.CurrentThread.ManagedThreadId
代码如下(示例):
using System;
using System.Threading;
namespace ProjectThread
{
public class ThreadDemo
{
public void Start()
{
//多个线程 可以同时执行不同的任务。。减少用户的等待
//通过线程调用方法
Thread t1 = new Thread(Thread01);
t1.Start();
Thread t2 = new Thread(Thread02);
t2.Start();
Thread t3 = new Thread(Thread03);
t3.Start();
int count = 0;
Thread t4 = new Thread(() => { count = Thread04(500);});
t4.Start();
//等待线程执行完毕
t4.Join();
Console.WriteLine("count = " + count);
// Thread01();
// Thread02();
// Thread03();
}
public void Thread01()
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("Thread01 - " + i);
}
}
public void Thread02()
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("Thread02 - " + i);
}
}
public void Thread03()
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("Thread03 - " + i);
}
}
public int Thread04(int count)
{
int _count = 0;
for (int i = 0; i < count; i++)
{
_count++;
Console.WriteLine("Thread04:" + i);
}
return _count;
}
}
}
namespace ProjectThread
{
internal class Program
{
public static void Main(string[] args)
{
ThreadDemo threadDemo = new ThreadDemo();
threadDemo.Start();
}
}
}
3.Thread线程的休眠、暂停、继续、中止
代码如下(示例):
using System;
using System.Threading;
namespace ProjectThread
{
/// <summary>
/// 通过信号的形式 控制线程的暂停和继续
/// </summary>
class ManualResetEventDemo
{
//停止的信号
ManualResetEvent mr = new ManualResetEvent(true);
public ManualResetEventDemo()
{
Thread t = new Thread(Thread01);
t.IsBackground = false; //false前台线程 true后台线程
t.Start();
Start();
}
public void Start()
{
//发送一个让线程继续执行的信号
mr.Set();
}
public void Stop()
{
mr.Reset();
}
public void Thread01()
{
Thread.Sleep(3000);
int i = 0;
while (true)
{
mr.WaitOne();
//线程ID是系统自动分配的 每次都是不同的ID 每个线程是唯一的ID
Console.WriteLine("线程的ID:" + Thread.CurrentThread.ManagedThreadId);
i++;
Console.WriteLine("i的值:" + i);
Thread.Sleep(3000);
}
}
}
}
using System;
namespace ProjectThread
{
internal class Program
{
public static void Main(string[] args)
{
// ThreadDemo threadDemo = new ThreadDemo();
// threadDemo.Start();
ManualResetEventDemo mre = new ManualResetEventDemo();
Console.WriteLine("输入 start:继续执行线程 stop:停止线程");
while (true)
{
string s = Console.ReadLine();
if (s=="start")
{
mre.Start();
}
else if (s == "stop")
{
mre.Stop();
}
}
}
}
}
4.Task任务的运行、阻塞、计时等待
任务Task .4.0之后
.net4.0之后推出的
.net4.5又开放了更多接口
创建任务
无需传递参数的
需要传递参数的
接收返回值
计时等待
等待任务执行完毕
取消任务
CancellationToken
bool 标志位 自定义逻辑 进行内部控制
暂停任务 继续执行
代码如下(示例):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ProjectThread
{
class TaskDemo
{
public void Start() {
//开始去执行三个任务
//Task.Run(Task01);
//Task.Run(Task02);
//Task.Run(Task03);
//Task t4= Task.Run(()=> {
// mCount=Task04(80);
// });
//线程等待
//等待线程的执行完毕
//t4.Wait();
//Console.WriteLine("COUNT:"+mCount);
//计时等待
Task.Run(Task05);
}
//异步操作
private async void Task05()
{
while (true)
{
Console.WriteLine("Task05执行中...");
//Task.Delay 可以执行一个延时的操作
await Task.Delay(1000);//单位毫秒 1000ms=1
}
}
public int mCount = 0;
private int Task04(int count)
{
int _count=0;
for (int i = 0; i < count; i++)
{
_count++;
Console.WriteLine("Task04:" + i);
}
return _count;
}
private void Task03()
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("Task03:" + i);
}
}
private void Task02()
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("Task02:" + i);
}
}
private void Task01()
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine("Task01:" + i);
}
}
}
}
using System;
namespace ProjectThread
{
internal class Program
{
public static void Main(string[] args)
{
TaskDemo taskDemo = new TaskDemo();
taskDemo.Start();
Console.ReadKey();
// ThreadDemo threadDemo = new ThreadDemo();
// threadDemo.Start();
// ManualResetEventDemo mre = new ManualResetEventDemo();
// Console.WriteLine("输入 start:继续执行线程 stop:停止线程");
// while (true)
// {
// string s = Console.ReadLine();
// if (s=="start")
// {
// mre.Start();
// }
// else if (s == "stop")
// {
// mre.Stop();
// }
// }
}
}
}
5.Task任务的取消、暂停、继续
代码如下(示例):
6.多线程数据的同步
代码如下(示例):