线程
进程
查看当前系统中的进程
打开任务管理器,查看当前运行的进程
编辑
在任务管理器里面查询当前总共运行的线程数
****
编辑****
举例:主线程执行
internal class ThreadTest
{
static void Main(string[] args)
{
Thread th = Thread.CurrentThread;
th.Name = "MainThread";
Console.WriteLine("线程ID是:{0},线程名称是:{1}", th.ManagedThreadId, th.Name);
}
}
输出结果
线程ID是:1,线程名称是:MainThread
internal class ThreadTest
{
static void Main(string[] args)
{
// 创建两个子线程
Thread t1 = new Thread(new ThreadStart(PrintStr));
Thread t2 = new Thread(new ThreadStart(PrintStr));
t1.Start();
t2.Start();
}
private static void PrintStr()
{
Thread th = Thread.CurrentThread;
Console.WriteLine("线程ID是:{0}", th.ManagedThreadId);
}
}
输出结果
线程ID是:7
线程ID是:6
通过ThreadStart 源码,可以看到它其实是一个委托
**
编辑**
internal class ThreadTest
{
static void Main(string[] args)
{
// 创建两个子线程
Thread t1 = new Thread(new ParameterizedThreadStart(PrintStrParam));
Thread t2 = new Thread(new ParameterizedThreadStart(PrintStrParam));
t1.Start("我是有参数1");
t2.Start("我是有参数2");
}
private static void PrintStrParam(Object obj)
{
Thread th = Thread.CurrentThread;
Console.WriteLine("线程ID是:{0},参数是:{1}", th.ManagedThreadId,obj);
}
}
输出结果
线程ID是:6,参数是:我是有参数1
线程ID是:7,参数是:我是有参数2
internal class ThreadTest
{
static void Main(string[] args)
{
// 创建两个子线程
Thread t1 = new Thread(new ThreadStart(printSleep));
t1.Start();
// 主线程睡眠 1 秒
Thread.Sleep(1000);
// 销毁线程
try
{
t1.Abort();
}
catch (ThreadAbortException e)
{
Console.WriteLine("进catch了吗???");
}
finally
{
Console.WriteLine("进finally了吗???");
}
}
private static void printSleep()
{
for (int i = 0; i < 10; i++)
{
// 睡眠 500 毫秒
Thread.Sleep(500);
Console.WriteLine("输出数字:{0}", i);
}
}
}
输出结果
输出数字:0
Unhandled exception. 输出数字:1
System.PlatformNotSupportedException: Thread abort is not supported on this platform.
输出数字:2
进finally了吗???
lock
块语法:lock
块**的参数不能是值类型和string
类型,必须是除了string
外的引用类型,而且这个引用类型对象必须是所有线程都能访问到的,否则锁不住。object
对象来作为指定的锁对象lock(expression)
{
// 代码逻辑
}
加锁前案例
internal class ThreadTest
{
static void Main(string[] args)
{
PhoneSale phone=new PhoneSale();
// 创建两个子线程
Thread t1 = new Thread(new ThreadStart(phone.SalePhone));
Thread t2 = new Thread(new ThreadStart(phone.SalePhone));
t1.Start();
t2.Start();
}
}
public class PhoneSale
{
// 数量
private int num = 1;
public void SalePhone()
{
if (num > 0)
{
Thread.Sleep(100);
num--;
Console.WriteLine("卖出一部手机,还剩下 {0} 个",num);
}
else
{
Console.WriteLine("卖完了....");
}
}
}
输出结果
卖出一部手机,还剩下 0 个
卖出一部手机,还剩下 -1 个
**加锁后案例
**
internal class ThreadTest
{
static void Main(string[] args)
{
PhoneSale phone=new PhoneSale();
// 创建两个子线程
Thread t1 = new Thread(new ThreadStart(phone.SalePhone));
Thread t2 = new Thread(new ThreadStart(phone.SalePhone));
t1.Start();
t2.Start();
}
}
public class PhoneSale
{
// 数量
private int num = 1;
public void SalePhone()
{
lock (this)
{
if (num > 0)
{
Thread.Sleep(100);
num--;
Console.WriteLine("卖出一部手机,还剩下 {0} 个", num);
}
else
{
Console.WriteLine("卖完了....");
}
}
}
}
输出结果
卖出一部手机,还剩下 0 个
卖完了....
为什么程序可以多线程执行呢? 程序中的多线程与CPU的多线程有什么关系?
目前电脑都是多核多CPU的,一个CPU在同一时刻只能运行一个线程,但是多个CPU在同一时刻就可以运行多个线程。
线程的最大并行数量上限是CPU核心的数量,但是,往往电脑运行的线程的数量远大于CPU核心的数量,所以 还是需要CPU时间片的切换
CPU运行速度太快,硬件处理速度跟不上,所以操作系统进行分 ** 时间片
管理** 。这样,从宏观角度来说是多线程并发的,因为CPU速度太快,察觉不到,看起来是同一时刻执行了不同的操作
全部0条评论
快来发表一下你的评论吧 !