进程:就是一个独立功能的程序
线程:进程中的一个实体,
***一个进程中可以包含多个线程
总结:
1、一个程序至少有一个进程,一个进程至少有一个线程
2、进程拥有独立的内存单元(多个应用程序互不影响),进程中的多线程是共享内存(一个线程死掉,整个进程死掉)
3、线程的执行必须依存于进程中,有进程控制执行多个线程
4、多线程意义:在一个进程中,让多个任务同时执行
线程分类:
前台线程:所有前台线程执行完毕——应用程序可以退出
后台线程:应用程序结束——后台线程自动结束
设置前后台线程:IsBackground = false/true;
***线程创建默认为——前台线程
线程的创建——Thread
?使用多线程:如果一个任务消耗时间较长——多线程(其他线程中操作消耗时间较长的任务)
Join:在哪个线程中出现了,那么当前线程要等Join的函数执行完成后,才会继续向下执行。
委托方式发起线程-异步委托
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace 异步委托{
class Program{
static void Test(int i,string str){
Console.WriteLine("test" + i + str);
Thread.Sleep(100);
return 100;
}
static void Main(string[] args){
Func<int,string,int> a = Test; //通过委托开启一个线程
IAsyncResult ar = a.BeginInvoke(100,"andi",null,null);
Console.WriteLine("main");
While(ar.IsCompleted == false){
Console.Write(".");
Thread.Sleep(10);
}
int res = a.EndInvoke(ar);
Console.WriteLine(res);
Console.ReadKey();
}
}
}
第一种线程方式:Thread t = new Thread(func);
using System;
using System.Threading;
namespace Thread创建线程{
class Mainclass{
public static void func1(){
Thread.Sleep(5000); //让线程停止5秒
for(int i = 0;i<100;i++){
Consolo.WriteLine("___:"+i);
}
}
public static void func2(){
for(int i = 0;i<100;i++){
Consolo.WriteLine(":"+i);
}
}
public static void Main (string[] args){
//线程:前台
Thread t = new Thread(func1);
t.IsBackground = true;
t.Start();
t.Join();//Main函数等t执行完再结束
Thread t1 = new Thread(func2);
t1.Start();
Consolo.WriteLine("主函数结束");
}
}
}
第二种线程方式:Thread(ParameterizedThreadStart)
using System;
using System.Threading;
namespace test{
class Mainclass{
public void func(object o){
Thread.Sleep(2000);
Consolo.WriteLine(o);
}
public static void Main (string[] args){
Thread t = new Thread(new ParameterizedThreadStart(func));
t.Start("object");
Consolo.WriteLine("主函数结束");
}
}
}
第三种线程方式:线程的容器——线程池
using System;
using System.Threading;
namespace test{
class Mainclass{
public void func(object o){
Thread.Sleep(2000);
Consolo.WriteLine(o);
}
public void func1(){
Consolo.WriteLine("func1");
}
public void func2(object o){
Consolo.WriteLine(o);
Consolo.WriteLine("func2");
}
public static void Main (string[] args){
//线程池 默认为后台线程
ThreadPool.QueueUserWordItem(func1);
ThreadPool.QueueUserWordItem(func2,"Young");
Thread.Sleep(2000);
Consolo.WriteLine("主函数结束");
}
}
}
第四种线程方式:任务Task
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace 任务{
class Program{
static void ThreadMethod(){
Console.WriteLine("任务开始" + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
Console.WriteLine("任务结束");
}
static void Main(string[] args){
//第一种
Task t = new Task(ThreadMethod);//传递一个需要线程去执行的任务
t.Start();
//第二种工厂模式
TaskFactory tf = new TaskFactory();
Task t = tf.StartNew(ThreadMethod);
Console.WriteLine("Main");
Console.ReadKey();
}
}
}