需求:
1.先创建一个列表并放置数据若干(这里:0~9)。
2.然后在对列表的数据进行加工(这里:将数据乘以2)。
3.将加工完了的数据表示出来。
阻塞线程实现
1.运行效果
2.代码
using System;
using System.Collections.Generic;
using System.Threading;
namespace 非阻塞线程模拟
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
new ZhuSai().main();
Console.ReadLine();
}
}
class ZhuSai
{
List<int> list0 = new List<int>();
int index = 0;
public void main()
{
var t0 = new Thread(fun0);
t0.Start();
var t1 = new Thread(fun1);
t1.Start();
}
void fun0()
{
for(int i = 0; i < 10; i++)
{
list0.Add(i);
index = i;
}
}
void fun1()
{
for(int i = 0; i < 10; i++)
{
bool isWhile = true;
while (isWhile)
{
if (index >= i)
{
isWhile = false;
}
}
list0[i] *= 2;
Console.WriteLine(list0[i]);
}
}
}
}
非阻塞线程实现
1.运行效果
2.代码分析
using System;
using System.Collections.Generic;
using System.Threading;
namespace 非阻塞线程模拟
{
class Program
{
static List<int> list0 = new List<int>();
static List<int> list1 = new List<int>();
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
new FeizhuSai().main();
Console.ReadLine();
}
}
class FeizhuSai
{
List<int> list0 = new List<int>();
public void main()
{
var t0 = new Thread(fun0);
t0.Start();
}
void fun0()
{
for(int i = 0; i < 10; i++)
{
list0.Add(i);
ThreadPool.QueueUserWorkItem(fun1, i);
}
}
void fun1(Object stateInfo)
{
int a = (int)stateInfo;
list0[a] *= 2;
Console.WriteLine(list0[a]);
}
}
}
代码分析
1.线程利用率分析
运算 | 阻塞 | 非阻塞 | ||
线程1 | 线程2 | 线程1 | 线程2 | |
0 | 0写入list0 | 等待 | 写入list0 | 计算0*2,并表示 |
1 | 1写入list0 | 等待+计算0*2,并表示 | 写入list0 | 计算1*2,并表示 |
2 | 2写入list0 | 等待+计算1*2,并表示 | 写入list0 | 计算2*2,并表示 |
3 | 3写入list0 | 等待+计算2*2,并表示 | 写入list0 | 计算3*2,并表示 |
4 | 4写入list0 | 等待+计算3*2,并表示 | 写入list0 | 计算4*2,并表示 |
5 | 5写入list0 | 等待+计算4*2,并表示 | 写入list0 | 计算5*2,并表示 |
6 | 6写入list0 | 等待+计算5*2,并表示 | 写入list0 | 计算6*2,并表示 |
7 | 7写入list0 | 等待+计算6*2,并表示 | 写入list0 | 计算7*2,并表示 |
8 | 8写入list0 | 等待+计算7*2,并表示 | 写入list0 | 计算8*2,并表示 |
9 | 9写入list0 | 等待+计算8*2,并表示 | 写入list0 | 计算9*2,并表示 |
空闲 | 等待+计算9*2,并表示 |
2.规律总结
1.阻塞方式cpu有等待,而非阻塞没有 cup等待
2.阻塞方式是两个线程协调处理,非阻塞是把任务交给另一个线程就不管了,如果线程1是领导的话,显然非阻塞的线程1管了的更轻松
3.从运行的效果看非阻塞明显顺序乱了,这个其实可以通过表示层处理优化的。
4.从cpu只有两个线程的理想状态分析,时候非阻塞看不出太多的优势,只第一个运算的时候有等待,后面的等待几乎没有发生。但是线程更复杂的情况,阻塞运算的每一个等待都可能真实发生。