Thread类可以创建和控制线程

最简单的例子 

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsolTread
{
    
class Program
    {
        
static void Main()
        {
            Thread t1 
= new Thread(ThreadMain);
            t1.Start();
            Console.WriteLine(
"this is main thread");
        }
        
static void ThreadMain()
        {
            Console.WriteLine(
"Running in a thread");
        }
    }
}

 

 给线程传送数据一般有两种方法:

第一种方法:

   public struct Data

        {
            
public string Message;
        }
        
static void Main()
        {
            Thread t1 
= new Thread(ThreadMain);
            t1.Name 
= "first";
            Data d 
= new Data();
            d.Message 
= "123";
            t1.Start(d);
            Console.WriteLine(
"this is main thread");
        }
        
static void ThreadMain(object o)
        {
            Data d
=(Data)o;
            
            Console.WriteLine(
"Running in a thread{0},Id:{1},Message:{2}",Thread.CurrentThread.Name,Thread.CurrentThread.ManagedThreadId,d.Message);
        }

 

 另外一种创建一个定制 类

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsolTread
{
    
class Program
    {
        
static void Main()
        {
            MyThread obj 
= new MyThread("obj");
            Thread t1 
= new Thread(obj.ThreadMain);
            t1.Start();
        }
        
public class MyThread
        {
            
private string data;
            
public MyThread(string data)
            {
                
this.data = data;
            }
            
public void ThreadMain()
            {
                Console.WriteLine(
"Running in a thread{0},Id:{1},Message:{2}", Thread.CurrentThread.Name, Thread.CurrentThread.ManagedThreadId, data);
            }
        }
    }
}

 

 解决竞争条件方法:第一种是可以使用lock锁定共享资源如下

 using System;

using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsolTread
{
    
class Program
    {//共享资源类
        
public class StateObject
        {
            
private int state=5;
            
public void ChangeState(int loop)
            {
                
if(state==5)
                {
                    state
++;
                    Trace.Assert(state 
== 6"Race condintion occurred after" + loop + "Loop");
                }
                state 
= 5;
            }
        }
        
public class SampleThread
        {
            
public void RaceCondition(object o)
            {
                Trace.Assert(o 
is StateObject, "o must be of type StateObject");
                StateObject state 
= o as StateObject;
                
int i = 0;
                
while (true)
                {
                    
lock (state)//共享资源锁定
                    {
                        state.ChangeState(i
++);
                    }
                }
            }
        }
        
static void Main()
        {
            StateObject state 
= new StateObject();
            
for (int i = 0; i < 20;i++)
            {
                
new Thread(new SampleThread().RaceCondition).Start(state);
            }
        }
    }
}

 

 第二种是将共享对象设置为线程完全的对象也就是在上面的ChangeState()方法包含一个lock语句

      

         public class StateObject{
            private int state=5;
            
private object sync = new object();
            
public void ChangeState(int loop)
            {
                
lock(sync)//每次修改state都来锁定sync对象
                {
                        
if(state==5)
                    {
                        state
++;
                        Trace.Assert(state 
== 6"Race condintion occurred after" + loop + "Loop");

                    }
                    state 
= 5;
                }
            }
        }

 

 线程同步

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;

namespace ConsolTread
{
    
class Program
    {
 
        
//设置一个共享状态
        public class SharedState
        {
            
public int state { getset; }
        }
        
public class Task
        {
            SharedState shareState;
            
public Task(SharedState shareState)
            {
                
this.shareState = shareState;
            }
            
public void DoTheTask()
            {

                
for (int i = 0; i < 5000;i++ )
                {
                    
lock(shareState)////////
                    {
                        shareState.state 
+= 1;
                    }
                   
                }
            }
        }

        
static void Main()
        {
            
int numThreads = 20;
            SharedState state 
= new SharedState();
            Thread[] threads 
= new Thread[numThreads];

            
for (int i = 0; i < numThreads;i++ )
            {
                threads[i] 
= new Thread(new Task(state).DoTheTask);
                threads[i].Start();
            }

            
for (int i = 0; i < numThreads; i++)
            {
                threads[i].Join();
            }
            Console.WriteLine(
"sum {0}",state.state);
        }
        
    }
}

 

 

 

posted on 2011-02-20 21:59  jackdesk  阅读(224)  评论(0编辑  收藏  举报