zoukankan      html  css  js  c++  java
  • 线程

    #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

  • 相关阅读:
    Javascript:window.close()不起作用?
    为什么全部width:100%浏览器边缘存在留白?
    hello world
    【Vue】在Vue事件中是如何使用event对象的?
    【Vue】特殊属性is
    【Vue】过滤器
    【Vue源码】Vue不能检测到对象属性的添加或删除
    【VueRouter】vue路由跳转打开新窗口
    【VueRouter】切换路由后,新页面滚动到顶部或保持原先的滚动位置——scrollBehavior
    【VueRouter】前端路由的两种模式
  • 原文地址:https://www.cnblogs.com/jinhaoObject/p/4711612.html
Copyright © 2011-2022 走看看