,Java、c#都提供了面向对象的线程模型。它们都抽象出了线程对象,而开发人员在某个类的成员方法中实现线程应用逻辑。通过分离线程对象和线程方法,简化了线程应用逻辑的开发。
在Java中开发线程有两种方法。第一种方法是由线程派生一个线程类,实现运行方法,并调用Thread.start方法启动线程,如:
类MyThread扩展线程{//创建线程类XML:名称空间前缀=o ns=" urn: schemas-microsoft-com:办公室:办公室"/>
公共空run(){…}//线程方法
}
MyThread aThread=new MyThread ();//创建一个线程对象
aThread.start ();//启动线程
第二种方法是通过实现Runable接口创建一个可执行类,并利用一个线程对象来启动线程,如:
,类MyRunable实现Runnable {
公共空run(){…}//线程方法
}
MyRunable aRunable=new MyRunable ();//创建一个可执行对象
,线程aThread=新线程(aRunable);,,//创建一个线程对象,并与可执行对象关联
,aThread.start (),,,//启动线程
c#的线程模型将线程对象和线程方法分离得更彻底,它可将任何一个原型为空白()的公有类成员方法(静态或非静态)用作线程方法;另外线程启动时还指定一个提供线程方法的对象(该对象提供线程应用逻辑所需的各种信息)。下面是一个简单的例子:
使用系统;
使用System.Threading;
公共类ThreadWork {,//ThreadWork不显式继承任何类,DoWork可作为线程方法
,公共空间DoWork () {(int i=0;我<10;+ +)控制台。WriteLine(“工作线程…”);},,//年底DoWork
},,//年底ThreadWork
类ThreadTest {
,公共静态void Main () {,//将对象aThread的DoWork方法作为线程方法执行
ThreadWork aThread=new ThreadWork ();
ThreadStart myThreadDelegate=new ThreadStart (aThread.DoWork);,//指定线程方法
线程myThread=新线程(myThreadDelegate);,//创建线程对象
myThread.Start ();,//启动线程
,},,//<死神>结束主要<死神>
,},//结束of ThreadTest
开发人员最关心的是如何实现线程方法. Java线程模型提供两种方法来实现线程方法,重载Runable.run方法或者重载Thread.run方法。开发人员可根据具体的应用场合选择合适的基类(Runable或者线程),这是Java线程模型的一个优点。另外可以看的到,Java线程模型中只能在Runable或线程的子类中实现线程方法(即子类的运行方法),而且每个子类只能实现一个线程方法C #线程模型由于允许将任何一个原型为空白()的公有类成员方法(静态或非静态)用作线程方法,因此它实际上允许在任何一个类(不要求这个类是某个类的子类)中实现线程方法,而且同一个类中可以实现多个线程方法。面向对象的线程模型有两个要素:线程对象和线程方法。线程对象封装线程本身相关的逻辑,如线程的创建,销毁等等。而线程方法就是线程对象实际执行的任务。利用面向对象线程模型进行多线程开发时,这样来思考问题会更自然:现在我有一项工作(即设计了一个线程方法),找一个工人(线程对象)来完成这个工作吧,所以我们认为c#的线程模型更灵活,而这种灵活性使得开发人员能够将程序结构组织的更加清晰,合理。