当前位置: 首页>编程语言>正文

停止中的容器如何查看文件 停止并终止

 你能看到这篇文章,说明你已经知道如何创建线程了,因此,这里就不说明线程的创建了,详细说一下线程的暂停和终止。

  我们首先了解一下,什么是前台线程后台线程

  .Net的公用语言运行时(CLR)能区分两种不同类型的线程:前台线程和后台线程。这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。

  对于如何暂停和继续线程的运行,在.net2.0之后,Suspend 、Resume 这两种方法都已停止使用,MS官方推荐使用标记判断的方式来处理线程的暂停与继续。

  对于线程的终止,在该线程处理完该线程的指定任务,退出该线程执行任务的函数后,线程状态将改变为"Stopped",然后分别依前台线程和后台线程的区别,在应用程序退出时线程会自动结束。因此,如果我们想使某个线程停止执行,就使该线程所执行的函数执行完毕就可以了。

  在使用多线程处理任务时,如果线程间的同步对象不是原子数值,而是类等引用类型,如果线程有写入的情况,则必须保证某一时刻只有一个线程能够写入,这就需要线程互斥,一般情况下,使用lock关键词处理。  

  互斥与同步

       互斥和同步是两个紧密相关而又容易混淆的概念。

       互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。

  同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源,如“第一类读写者模型”。

  关于线程同步,可以看这篇文章:

  对于在线程调用的方法中向外传递数据,使用事件向执行该方法的对象传递需要发送出的数据。

  下面,是我测试的代码:

 


代码

1      using 
     System;
       2  
     
    using 
     System.Collections.Generic;
       3  
     
    using 
     System.Text;
       4  
     
    using 
     System.Threading;
       5  
    
       6  
     
    namespace 
     ThreadTest
       7  
    {
       8  
         
    class 
     Program
       9  
        {
      10  
             
    static 
      
    void 
     Main( 
    string 
    [] args)
      11  
            {
      12  
                 
    try 
    
      13  
                {
      14  
                    Thread[] ts  
    = 
      
    new 
     Thread[ 
    2 
    ];
      15  
                    ABC[] arr  
    = 
      
    new 
     ABC[ 
    2 
    ];
      16  
                    ABC info;
      17  
                     
    for 
     ( 
    int 
     i  
    = 
      
    0 
    ; i  
    < 
     ts.Length;  
    ++ 
    i)
      18  
                    {
      19  
                        info  
    = 
      
    new 
     ABC();
      20  
                        info.IsStop  
    = 
      
    false 
    ;
      21  
                        arr[i]  
    = 
     info;
      22  
                        ts[i]  
    = 
      
    new 
     Thread( 
    new 
     ParameterizedThreadStart(info.Run));
      23  
                        ts[i].Name  
    = 
      
    string 
    .Format( 
    " 
    thread__{0} 
    " 
    , i);
      24  
                        ts[i].IsBackground  
    = 
      
    true 
    ;
      25  
                    }
      26  
                    Thread.Sleep( 
    1000 
    );
      27  
                     
    for 
     ( 
    int 
     i  
    = 
      
    0 
    ; i  
    < 
     ts.Length;  
    ++ 
    i)
      28  
                    {
      29  
                        ts[i].Start();
      30  
                    }
      31  
                    Thread.Sleep( 
    2000 
    );
      32  
                     
    for 
     ( 
    int 
     i  
    = 
      
    0 
    ; i  
    < 
     arr.Length;  
    ++ 
    i)
      33  
                    {
      34  
                        arr[i].IsStop  
    = 
      
    true 
    ;
      35  
                    }
      36  
                    Thread.Sleep( 
    5000 
    );
      37  
                     
    for 
     ( 
    int 
     i  
    = 
      
    0 
    ; i  
    < 
     ts.Length;  
    ++ 
    i)
      38  
                    {
      39  
                        Console.WriteLine( 
    " 
    {0}__{1} 
    " 
    , ts[i].Name, ts[i].ThreadState);
      40  
                    }
      41  
                    Thread.Sleep( 
    5000 
    );
      42  
                     
    for 
     ( 
    int 
     i  
    = 
      
    0 
    ; i  
    < 
     ts.Length;  
    ++ 
    i)
      43  
                    {
      44  
                        Console.WriteLine( 
    " 
    {0}__{1} 
    " 
    , ts[i].Name, ts[i].ThreadState);
      45  
                        ts[i].Abort();
      46  
                    }
      47  
                    Thread.Sleep( 
    5000 
    );
      48  
                     
    for 
     ( 
    int 
     i  
    = 
      
    0 
    ; i  
    < 
     ts.Length;  
    ++ 
    i)
      49  
                    {
      50  
                        Console.WriteLine( 
    " 
    {0}__{1} 
    " 
    , ts[i].Name, ts[i].ThreadState);
      51  
                    }
      52  
                    Console.WriteLine( 
    " 
    ... 
    " 
    );
      53  
                }
      54  
                 
    catch 
     (Exception ex)
      55  
                {
      56  
                    Console.WriteLine(ex.Message);
      57  
                }
      58  
            }
      59  
    
      60  
             
    class 
     ABC
      61  
            {
      62  
                 
    int 
     start  
    = 
      
    0 
    ;
      63  
                 
    int 
     end  
    = 
      
    0 
    ;
      64  
    
      65  
                 
    public 
      
    bool 
     IsStop
      66  
                {
      67  
                     
    get 
    ;
      68  
                     
    set 
    ;
      69  
                }
      70  
    
      71  
                 
    public 
     ABC()
      72  
                {
      73  
                     
    int 
     a  
    = 
      
    new 
     Random(( 
    int 
    )DateTime.Now.Ticks).Next( 
    0 
    ,  
    50 
    );
      74  
                     
    int 
     b  
    = 
      
    new 
     Random(( 
    int 
    )DateTime.Now.Ticks).Next( 
    51 
    ,  
    100 
    );
      75  
                    start  
    = 
     Math.Min(a, b);
      76  
                    end  
    = 
     Math.Max(a, b);
      77  
                }
      78  
    
      79  
                 
    public 
      
    void 
     Run( 
    object 
     o)
      80  
                {
      81  
                    Console.WriteLine();
      82  
                    Console.WriteLine( 
    " 
    start {0}__{1} 
    " 
    , Thread.CurrentThread.Name, Thread.CurrentThread.ThreadState);
      83  
                    Console.WriteLine();
      84  
                     
    for 
     ( 
    int 
     i  
    = 
     start; i  
    <= 
     end;  
    ++ 
    i)
      85  
                    {
      86  
                        Console.Write(i);
      87  
                    }
      88  
                    Console.WriteLine();                        
      89  
                    Console.WriteLine( 
    " 
    isRun {0}__{1} 
    " 
    , Thread.CurrentThread.Name, Thread.CurrentThread.ThreadState);
      90  
    
      91  
                     
    while 
     ( 
    true 
    )
      92  
                    {
      93  
                         
    if 
     ( 
    ! 
    IsStop)
      94  
                        {
      95  
                             
    // 
    在此处执行具体操作 
    
      96  
     
                            Thread.Sleep( 
    1 
    );
      97  
                             
    continue 
    ;
      98  
                        }
      99  
                         
    else 
    
     100  
                        {
     101  
                             
    break 
    ;
     102  
                        }
     103  
                    }
     104  
                    Console.WriteLine( 
    " 
    end {0}__{1} 
    " 
    , Thread.CurrentThread.Name, Thread.CurrentThread.ThreadState);
     105  
                }
     106  
            }
     107  
        }
     108  
    }
     109

 

  这是执行结果:

停止中的容器如何查看文件 停止并终止,停止中的容器如何查看文件 停止并终止_应用程序,第1张

 

 

  如上图可见,线程执行时,其状态值为Background,当线程执行完成后,其状态值为Stopped.

  以上是以后台线程为例。



https://www.xamrdz.com/lan/5ym1962195.html

相关文章: