zoukankan      html  css  js  c++  java
  • C#多线程学习之Thread

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Threading;
      6 
      7 namespace ThreadTest
      8 {
      9     class Program
     10     {
     11        static void DoWork()
     12         {
     13             Console.WriteLine("DoWork is begin");
     14 
     15             for (int i = 0; i < 10; i++)
     16             {
     17                 try
     18                 {
     19                     if (i == 7)
     20                     {
     21                         //终止线程,会抛出一个ThreadAbortException 类型的异常
     22                         Thread.CurrentThread.Abort(i);
     23                     }
     24 
     25                     Console.WriteLine(string.Format("{0} {1}", Thread.CurrentThread.Name, i));
     26                     Thread.Sleep(300);
     27                 }
     28                 catch (ThreadAbortException e)
     29                 {
     30                     Console.WriteLine(string.Format("{0} is Abort when i is {1}", Thread.CurrentThread.Name, e.ExceptionState));
     31 
     32                     //取消终止,静态方法
     33                     Thread.ResetAbort();
     34                 }
     35                 
     36             }
     37 
     38             Console.WriteLine("DoWork is end");
     39         }
     40 
     41         /// <summary>
     42         /// 
     43         /// </summary>
     44         /// <param name="args"></param>
     45         static void Main(string[] args)
     46         {
     47             Console.WriteLine("Main thread begin");
     48 
     49 
     50             #region  Thread类构造函数的参数是:不带参数的静态方法
     51 
     52             Thread myThread1 = new Thread(Program.DoWork);
     53             myThread1.Name = "thread1";
     54 
     55             /*
     56              *  有关前台线程和后台线程
     57              *  线程Thread有一个属性IsBackground,通过把此属性设置为true,就可以把线程设置为后台线程!
     58              *  当一个进程除了主线程之外其他线程都是后台线程时,应用程序域将在主线程完成时就被卸载,而不会等待异步线程的运行。
     59              * 使用Thread.Start()启动的线程默认为前台线程,而系统必须等待所有前台线程运行结束后,应用程序域才会自动卸载。
     60              */
     61 
     62             //设置为后台线程
     63             myThread1.IsBackground = true;
     64             
     65             myThread1.Start();
     66 
     67             #endregion
     68 
     69 
     70 
     71             #region  Thread类构造函数的参数是:带参数的非静态方法
     72 
     73             string str = string.Format("test");
     74             Test myTest = new Test();
     75 
     76             //如果Thread的构造函数的参数是带参数的方法,则这个参数要求是object类型
     77             Thread myThread2 = new Thread(myTest.ShowMessage);
     78             myThread2.Name = "thread2";
     79 
     80             //设置为前台线程,默认为前台线程
     81             myThread2.IsBackground = false;
     82          
     83             myThread2.Start(str);
     84 
     85 
     86             /*
     87              * thread线程间的同步:join方法
     88              * 
     89              * 关于对 Thread类实例的Join方法的理解.
     90              * 两个线程的关系如下:一个线程(旧的)生成并启动另一个线程(新的).
     91              * join方法只能在以下条件被调用:一个新的线程被创建并且调用start方法后.
     92              * join方法的作用:阻塞。在旧的线程代码里,运行到行新线程实例的join方法时,旧线程将会被阻塞,
     93              * 直到新线程(不管是前台还是后台线程)执行完成后,旧线程才会继续执行join方法后面的代码。
     94              * 
     95              * 比喻如下:线程A创建了线程B和线程C并且都调用start方法启动了线程B和C,线程A才能调用线程B和C的join方法,
     96              * 表示线程A将阻塞等到线程B和C执行完之后再继续执行。但线程B和C之间是不用通过join方法来通信或者同步的。
     97              * 
     98              * 在本例里,main线程是主线程,创建线程myThread1和myThread2并都启动了,在执行到myThread2.Join();代码时,
     99              * 主线程main线程将被阻塞,直到myThread2线程执行完之后,再继续执行
    100              * 
    101              */
    102 
    103             myThread2.Join();
    104 
    105 
    106             #endregion
    107 
    108 
    109             //其他:Suspend 与 Resume 方法分别表示挂起和恢复线程,已过时,微软不建议继续使用,不做介绍。
    110 
    111             Console.WriteLine("Main thread end");
    112             Thread.Sleep(2000);
    113        //     Console.ReadKey();
    114         }
    115 
    116         
    117     }
    118 
    119     class Test
    120     {
    121         //要作为Thread的构造函数的参数,则这个参数要求是object类型
    122         public void ShowMessage(object obj)
    123         {
    124             Console.WriteLine("ShowMessage is begin");
    125 
    126             string str = obj as string;
    127             for (int i = 0; i < 10; i++)
    128             {
    129                 Console.WriteLine(string.Format("{0} {1}{2}", Thread.CurrentThread.Name,str, i));
    130                 Thread.Sleep(500);
    131             }
    132 
    133             Console.WriteLine("ShowMessage is end");
    134         }
    135     }
    136 }
  • 相关阅读:
    P2015 二叉苹果树(树形DP)
    Treats for the Cows (区间DP)
    You Are the One(区间DP 好题)
    Palindrome subsequence (区间DP)
    Cutting Sticks(区间DP)
    L2-013 红色警报 (dfs判断图连通性)
    L2-001 紧急救援 (dijkstra+dfs回溯路径)
    多线程 -- JMM、volatile关键字、内存屏障、happens-before原则、缓存一致性
    多线程 -- 各种锁的概念
    Spring Boot 学习笔记(十六)启动原理、运行流程、自动配置原理
  • 原文地址:https://www.cnblogs.com/zouzf/p/3289610.html
Copyright © 2011-2022 走看看