进程(Process)是操作系统中的一个独立实体,是程序执行的一个实例。进程是【系统进行资源分配的基本单位】,是程序运行的环境。每个进程都具有自己的内存空间,包括代码、数据和堆栈等,这些资源是独立的,进程之间的数据通常是隔离的。
线程(Thread)是操作系统能够进行【运算调度的最小单位】,是进程中的实际运作单位。线程必须包含在进程中。一条线程指的是进程中一个单一顺序的控制流,进程中可以包含多个线程。
1.每个线程独立于其他线程运行。
2.多个线程可以同时执行,提高了程序的执行效率。
3.线程可以共享进程的资源。
1.进程包含线程,一个进程中可以并发多个线程,这些线程共享进程的资源,但执行各自的任务。
2.线程不能独立运行,进程是线程的容器,线程在进程中运行。
Unstarted |
尚未对线程调用Start()方法 |
Running | 线程已启动且尚未停止 |
Stopped | 线程以停止执行 |
Suspended | 线程以挂起 |
Background | 线程正作为后台线程执行,后台线程在所有前台线程都结束时会立即终止 |
WaitSleepJoin | 线程因调用Wait 、Sleep 或Join 而被阻塞 |
AbortRequested | 已对线程调用了Abort 方法,但线程尚未接收到终止的信号 |
Aborted | 线程响应Abort 请求并终止执行 |
StopRequested | 正在请求线程停止,这是一个内部状态 |
线程优先级:
Lowest | 线程可以被安排在其他任何优先级的线程之后执行 |
BelowNormal | 线程可以被安排在具有Normal 优先级的线程之后,在具有Lowest 优先级的线程之前执行 |
Normal | 默认的线程优先级 |
AboveNormal | 线程可以被安排在具有High 优先级的线程之后,在具有Normal 优先级的线程之前执行 |
Highest | 线程可以被安排在具有任何其他优先级的线程之前执行 |
线程可以通过Thread
类实例化
public Form1()
{
Thread thread1 = new Thread(() =>
{
Console.WriteLine("线程做的具体的工作,工作一般比较耗时");
Console.WriteLine("将来也有可能把耗时的任务封装成方法");
});
Thread thread2 = new Thread(DoWork);
}
public void DoWork()
{
Console.WriteLine("线程正在运行...");
}
跨线程访问:
主线程中的控件修改,重新赋值推荐使用Invoke()方法
Thread thread;
//按钮点击事件
private void button1_Click(object sender, EventArgs e)
{
thread = new Thread(() =>
{
Invoke(new Action(() => { button1.Text = "hello"; }));
});
}
使用Thread
类的构造函数可以向线程传递参数。下面的示例展示了如何使用ParameterizedThreadStart
public Form1()
{
object str = "you";
Thread thread = new Thread(new ParameterizedThreadStart(DoWork));
thread.Start(str);
}
void DoWork(object data)
{
Console.WriteLine(data);
}
Thread thread;
bool isCancel=false;//取消标识
public Form1()
{
//创建线程
thread = new Thread(() => {
while(true)
{
Console.WriteLine("abc");
}
});
}
private void button1_Click(object sender, EventArgs e)
{
thread?.Start();//启动线程
}
private void button2_Click(object sender, EventArgs e)
{
thread?.Suspend();//暂停线程
}
private void button3_Click(object sender, EventArgs e)
{
thread?.Resume();//继续线程
}
private void button4_Click(object sender, EventArgs e)
{
isCancel = true;//把取消标识设成true之后,表示分线程中执行任务已经完成
thread?.Abort();//中止线程
}
多线程是指让程序同时运行多个线程来执行不同的任务,多个线程并行执行(执行时无顺序)。
1.线程可同时执行多个任务,提高程序的响应速度。
2.充分利用多核处理器,提高了程序性能。
3.可以将任务分解成多个线程,使得代码结构更加清晰,便于维护和复用
1.线程运行需要占用计算机资源,线程越多占用资源也越多。(占内存多)
2.多线程需要协调和管理,所以需要CPU跟踪线程,消耗CPU资源。(占cpu多)
3.多线程存在资源共享问题。
4.线程太多会导致控制太复杂,管理麻烦,容易产生bug。
线程池(ThreadPool)是一个由.NET Framework提供的管理多个线程的机制。线程池中可以存在多个线程,让线程池来自动管理。线程池中的线程是后台线程,它们在完成任务后会返回到线程池中等待下一个任务,而不是被销毁,这样可以减少创建和销毁线程的开销。
//开启线程
private void button1_Click(object sender, EventArgs e)
{
//WaitCallback===public delegate void WaitCallback(object state);
ThreadPool.QueueUserWorkItem((state) =>
{
Console.WriteLine(state);
}, "abc1");
ThreadPool.QueueUserWorkItem((state) =>
{
Console.WriteLine(state);
}, "abc2");
ThreadPool.QueueUserWorkItem((state) =>
{
Console.WriteLine(state);
}, "abc3");
}
//线程等待
private void button2_Click(object sender, EventArgs e)
{
ManualResetEvent resetEvent = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(o =>
{
// 分线程的代码是有序,线程和其他线程的执行是无序,想有序借助优先级。
this.DoSomething(o.ToString());
resetEvent.Set();
}, "张三");
resetEvent.WaitOne();// 阻塞,等待Set()执行,才执行以下的代码
Console.WriteLine("AAAAAA");
}
private void DoSomething(string s)
{
Thread.Sleep(10000);
Console.WriteLine(s);
}
解决了部分Thread管理不便的问题,移除了无用的Thread API。提高了线程运行性能。