定义:Thread t = new Thread(Test); //可以用匿名 lamda
调用:t.Start("ljc6666");方法可以无参或一个参数,如果要传入多个参数,可以传入一个结构体
namespace _17_线程Thread
{
internal class Program
{
static void Test()
{
Console.WriteLine("1");
Thread.Sleep(3000);//子线程等3s
Console.WriteLine("2");
}
struct Data
{
public int Value;
public int Value2;
}
static void show(object o)
{
Data op = (Data)o;
Console.WriteLine("给我什么打印什么:"+ op.Value + op.Value2.ToString());
}
delegate void TestDelegate();
static void Main(string[] args)
{
//Thread t = new Thread(Test);
//t.Start();
//Thread.Sleep(1000);//主线程等1s
//Console.WriteLine("3");
//Thread t = new Thread(() => Console.WriteLine("拉姆达表达式线程,线程id为:"+Thread.CurrentThread.ManagedThreadId));
//t.Start();
//Thread t = new Thread(delegate ()
//{
// Console.WriteLine("匿名表达式线程,线程id为:" + Thread.CurrentThread.ManagedThreadId);
//});
//t.Start();
//Console.WriteLine("主线程,线程id为:" + Thread.CurrentThread.ManagedThreadId);
Data data = new Data();
data.Value = 1;
data.Value2 = 2;
Thread t = new Thread(show);
//t.Start("ljc6666");
t.Start(data);
}
}
}
namespace _18_前台后台线程
{
internal class Program
{
static void Test()
{
Console.WriteLine(Thread.CurrentThread.Name+"线程开启");
Thread.Sleep(1000);
Console.WriteLine(Thread.CurrentThread.Name+"线程结束");
}
static void Main(string[] args)
{
Thread thread = new Thread(Test);
thread.IsBackground = true; //设置为后台线程
//thread.IsBackground = false; //设置为前台线程
thread.Start();
Console.WriteLine("主线程结束");
}
}
}
namespace _19_线程优先级和状态
{
internal class A
{
}
internal class Program
{
static void A()
{
int i = 0;
bool flag = true;
while (flag)
{
i++;
Console.Write("a:"+i+" ");
if (i>200000 )
flag = false;
}
}
static void B()
{
int i = 0;
bool flag = true;
while (flag)
{
i++;
Console.Write("b:" + i + " ");
if (i > 200000)
flag = false;
}
}
static void C()
{
int i = 0;
bool flag = true;
while (flag)
{
i++;
Console.Write("c:" + i + " ");
if (i > 200000)
flag = false;
}
}
static void Main(string[] args)
{
Thread a = new Thread(A);
Thread b = new Thread(B);
Thread c = new Thread(C);
a.Priority = ThreadPriority.Highest;
b.Priority = ThreadPriority.Lowest;
a.Start();
b.Start();
a.Join();
Console.WriteLine("a线程结束");
b.Join();
Console.WriteLine("b线程结束");
}
}
}
namespace _20_线程池
{
internal class Program
{
static void Download(object s)
{
for (int i = 0; i <3;i++)
{
Console.WriteLine("线程"+Thread.CurrentThread.ManagedThreadId+"正在下载");
Thread.Sleep(100);
}
}
static void Main(string[] args)
{
for(int i = 0; i < 10;i++)
{
ThreadPool.QueueUserWorkItem(Download);
}
Thread.Sleep(5000);
}
}
}
任务有两种启动方式,需要注意的是 任务是后台线程
namespace _21_任务
{
internal class Program
{
static void DownLoad()
{
Console.WriteLine("正在下载,请等待...");
Thread.Sleep(1000);
}
static void Ok(object a)
{
Console.WriteLine("下载完成");
}
static void Main(string[] args)
{
//TaskFactory tf = new TaskFactory();
//Task T = tf.StartNew(DownLoad);
//Task t = new Task(DownLoad);
//t.Start();
Task t1 = new Task(DownLoad);
Task t2 = t1.ContinueWith(Ok);
t1.Start();
Thread.Sleep(1500);//任务是后台线程
}
}
}
当有多个地方同时访问一个资源时,可能会导致资源冲突(例如一个变量被多个地方使用),此时可以用锁的方式防止被多次调用
缺点:运行速度会降低
namespace _22_资源访问冲突问题
{
internal class Class1
{
private object _lock = new object();
private int state = 5;
public void changestate()
{
lock (_lock)
{
if (state == 5)
{
state++;
Console.WriteLine(Thread.CurrentThread.ManagedThreadId + "状态为:" + state);
}
state = 5;
}
}
}
internal class Program
{
static void Main(string[] args)
{
Class1 c1 = new Class1();
for (int i = 0; i < 100; i++)
{
Thread thread = new Thread(c1.changestate);
thread.Start();
}
}
}
}
有多个锁的时候需要注意锁的先后顺序,下面这个讲的很好
408-多线程的死锁问题_哔哩哔哩_bilibili