Java、c#线程模型分析对比(转)

  Java、c#线程模型分析对比(转)[@more@]

  

,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#的线程模型更灵活,而这种灵活性使得开发人员能够将程序结构组织的更加清晰,合理。

Java、c#线程模型分析对比(转)