#region 简单线程理解初级
//static void Main(string[] args)
//{
// Thread thread = new Thread(GO);
// thread.Start();
// thread.Join();//线程阻塞作用,将会等待该线程执行完成后执行下一个线程
// // 使用带参数委托ParameterizedThreadStart
// Thread t2 = new Thread(GOParameters);//方法参数一定要是object
// t2.Start("caijinhao");
// //t2.Join();// 等待线程t2完成。
// Console.ReadKey();
//}
//static void GO()
//{
// Console.WriteLine("第一个线程开始了");
// Thread.Sleep(10000);//将当前线程挂起1s
// Console.WriteLine("10s后");
//}
//static void GOParameters(object str)//必须要传 object
//{
// Console.WriteLine("带参数的第二个线程已经走完了,参数是:{0}",str);
//}
#endregion
#region 线程并发举例
//static void Main(string[] args)
//{
// Thread threadone = new Thread(fnhelper.OutString1000);//有线程就要有调用方法
// threadone.Name = "线程one";
// threadone.Start();
// Thread threadTwo = new Thread(fnhelper.OutString1000);
// threadTwo.Name = "线程two";
// threadTwo.Start();
// Thread threadThree = new Thread(fnhelper.OutString1000);
// threadThree.Name = "线程three";
// threadThree.Start();
// Console.ReadKey();
//}
#endregion
#region 禁止线程并发
//static bool done=false;
//static object locker = new object();//用于锁
//static int i = 1;
//static void Main(string[] args)
//{
// //如果想共享线程间的数据,当一个线程执行了这个方法后就不在去执行要用lock
// new Thread(Go).Start();// 在新的线程上调用Go
// Go();//在主线程上调用Go
// //这样写其实是并发线程
// //所以会执行两次,而且都是1
// #region 第一种解决方法 这样就不会并发了
// //Thread t=new Thread(Go);// 在新的线程上调用Go
// //t.Start(); t.Join();//这样就不会并发了
// //这样只会执行一次
// #endregion
// #region 第二种解决方法
// //添加锁
// #endregion
// Console.ReadKey();
//}
//static void Go()
//{
// //锁住这个对象 当这个对象进来的时候 把门锁上了,另一个在外面等,完事了他才能进来
// lock (locker)
// {
// //等他进来之后发现done的值已经更改了 进不去了
// if (!done)
// {
// Console.WriteLine("执行了{0}次",i);
// i++;
// done = true;
// Thread.Sleep(3000);
// }
// }
//}
#endregion
#region 指定时间运行线程方法
//static void Main(string[] arg)
//{
// //等待信号
// var signal = new ManualResetEvent(false);
// new Thread(() =>
// {
// signal.WaitOne();
// Go();
// signal.Dispose();//这里只是释放资源
// }).Start();
// Console.WriteLine("等待信号,20s后会执行");
// Thread.Sleep(21000);
// signal.Set();//打开信号, 有这个才会执行线程
// //可通过 Reset 将信号关闭
// //signal.Reset();
// //如若不需要信号来 禁止 可通过Dispose将其释放
// Console.ReadKey();
//}
//static void Go()
//{
// Console.WriteLine("收到信号.我运行了");
// Console.WriteLine("蔡金浩");
//}
#endregion
#region 线程池中的线程
//主要用于大量时间处于等待(或阻塞)的任务不去支配线程池的线程。
//消耗时间<250s的可以用线程池
static void Main(string[] arg)
{
//使用线程中的线程 方式有2种
Task.Run(() => { Console.WriteLine("caijinhao");});//注意.net framework 4.5才有
ThreadPool.QueueUserWorkItem(t => { Console.WriteLine("caijinhao又一次"); });
//创建不走线程池中的线程,可以直接通过new Thread来创建
//也可以通过下面的代码来创建
Task task = Task.Factory.StartNew(() => { Console.WriteLine("蔡金浩第三次",
TaskCreationOptions.LongRunning); });//注意必须带TaskCreationOptions.LongRunning参数
}
#endregion