线程学习2——Thread类
Thread 类
使用Thread类可以创建和控制线程,Thread类有如下方法:
Start():启动线程;
Sleep(int):静态方法,暂停当前线程指定的毫秒数;
Abort():通常使用该方法来终止一个线程;
Suspend():该方法并不终止未完成的线程,它仅仅挂起线程,以后还可恢复;
Resume():恢复被Suspend()方法挂起的线程的执行。
基本用法:
静态的方法:
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
public static void myStaticThreadMethod()
{
Console.WriteLine("myStaticThreadMethod");
Console.ReadLine();
}
static void Main(string[] args)
{
Thread thread1 = new Thread(myStaticThreadMethod);
thread1.Start(); // 只要使用Start方法,线程才会运行
}
}
}
在线程中运用实例的方法:
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
public void myThreadMethod()
{
Console.WriteLine("myThreadMethod");
Console.ReadLine();
}
static void Main(string[] args)
{
Thread thread2 = new Thread(new Program().myThreadMethod);
thread2.Start();
}
}
}
为了更好地控制线程,可以在线程启动前,设置Name属性,给线程指定名称。
为了获得当前线程的名称,可以使用静态属性Thread.CurrentThread,获取当前线程的Thread实例,访问Name属性,进行读取访问。
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Thread.CurrentThread.Name = "System Thread";//给当前线程起名为"System Thread"
Console.WriteLine(Thread.CurrentThread.Name + " Status:" + Thread.CurrentThread.ThreadState);
Console.ReadLine();
}
}
}
定义一个线程类
我们可以将Thread类封装在一个MyThread类中,以使任何从MyThread继承的类都具有多线程能力。MyThread类的代码如下:
using System.Threading;
namespace ConsoleApplication1
{
abstract class MyThread
{
Thread thread = null;
abstract public void run();
public void start()
{
if (thread == null)
thread = new Thread(run);
thread.Start();
}
}
class Program:MyThread
{
override public void run()
{
Console.WriteLine("使用MyThread建立并运行线程");
Console.ReadLine();
}
static void Main(string[] args)
{
Program mPro = new Program();
mPro.start();
}
}
}
为线程传递参数
如果需要给线程传递一些数据,可以采用两种方式。一种方式是使用带ParameterizedThreadStart委托参数的Thread构造函数,另一种是创建一个定制类,把线程的方法定义为实例方法,这样就可以初始化实例的参数,之后启动线程。
如果使用了ParameterizedThreadStart委托,线程的入口点必须有一个Object类型的参数,返回类型为void。
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
public static void myThreadMethod(object obj)
{
Console.WriteLine(obj);
Console.ReadLine();
}
static void Main(string[] args)
{
Thread thread2 = new Thread(myThreadMethod);
thread2.Start("为线程传递参数!");
}
}
}
要注意的是,如果使用的是不带参数的委托,不能使用带参数的Start方法运行线程,否则系统会抛出异常。但使用带参数的委托,可以使用thread.Start()来运行线程,这时所传递的参数值为null。
给新线程传送数据的另一种方式是定义一个类,将线程的主方法定义为类的一个实例方法:
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
private String mStr;
private int mInt;
public Program(String mStr, int mInt)
{
this.mStr = mStr;
this.mInt = mInt;
}
public void myThreadMethod()
{
Console.WriteLine(mStr);
Console.WriteLine(mInt);
Console.ReadLine();
}
static void Main(string[] args)
{
Program mPro = new Program("abcd",1234);
Thread thread2 = new Thread(mPro.myThreadMethod);
thread2.Start();
}
}
}