进程、线程、多线程的初步学习

来源:互联网 发布:php string indexof 编辑:程序博客网 时间:2024/05/21 22:34

//进程是当一个程序开始运行时,她就是一个进程
//线程是一个程序运行中的一个执行流 例如播放器 运行的时候可以看歌词,就是一个线程
//多线程 迅雷中的下载就是一个例子 下载一个是单线程 同时下载多个就是多线程 提高cpu的里利用率
//多线程同时也有不利的 线程也是程序 需要占用内存,多线程需要协调和管理,所以需要cpu时间跟踪线程
// 线程之间对共享资源的访问会相互影响,必须解决竞用共享资源的问题;线程太多会导致控制太复杂,最终可能造成很多Bug;
// 用 Thread 类创建线程时, 只需提供线程入口(线程入口使程序知道该让这个线程干什么事)
//创建线程的语法:
// 2:Thread newThread = new Thread(方法);
// 注意:方法可以是静态的也可以为非静态
//方法可以是本类的也可以为非本类
//思考:如果线程的入口方法带参数怎么办?
//那么参数一定是Object类型
//线程的参数请由对象或类进行承载
static void Main(string[] args)
{
//没有参数类型的
Thread t = new Thread(RunDownload);
t.Start();
//有参数类型的
Thread t1 = new Thread(Run);
List list= new List { 1, 2, 3, 4, 5 };
t1.Start(list);
}
static void RunDownload()
{
Console.WriteLine(“开始下载”);
}
static void Run(object obj)
{

 List<int> s = obj as List<int>;        foreach (var item in s)        {            Console.WriteLine(item);        }    }

//多线程的使用
static void Main(string[] args)
{
Thread t1 = new Thread(RunDownload);
Thread t2 = new Thread(ReadFile);
t1.Start();
t2.Start();
//获取当前运行状态
Console.WriteLine(t1.ThreadState);
}
Console.WriteLine(t2.ThreadState);
}
static void RunDownload()
{
int i = 0;
while (true)
{
Thread.Sleep(50);
//Console.WriteLine(“下载”);
Console.Write(i+++”\t”);
}
}
static void ReadFile()
{
while (true)
{
Thread.Sleep(500);
Console.WriteLine();
}
}
//当多个线程同时运行一个方法时我们需要用一个 lock (this)//互斥锁 或者Monitor来解决死锁现象
static void Main(string[] args)
{
Student s = new Student();
Thread t1 = new Thread(s.Run);
Thread t2 = new Thread(s.Run);
Thread t3 = new Thread(s.Run);
t1.Name = “汽车1”;
t2.Name = “汽车2”;
t3.Name = “汽车3”;
t1.Start();
t2.Start();
t3.Start();
}
class Student
{
public void Run()
{
//解决死锁方式1
lock (this)//互斥锁 ,解决线程同步问题,多个线程操作同一个方法的时候会出现死锁
{
Console.WriteLine(Thread.CurrentThread.Name+”过隧道”);
Thread.Sleep(2000);
}
//
//解决死锁方式2
//Monitor.Enter(this);
//Console.WriteLine(Thread.CurrentThread.Name+”过隧道”);
//Thread.Sleep(2000);
//Monitor.Exit(this);
}
}
}
//如果是静态方法则需要

static Object obj = new object();
static void Student()
{
lock (obj)
{
Console.WriteLine(Thread.CurrentThread.Name+”过隧道”);
Thread.Sleep(2000);
}
}
}