Java、C#线程模型分析对比 (转)
Java、C#都提供了面向对象的线程模型。它们都抽象出了线程对象,而开发人员在某个类的成员方法中实现线程应用逻辑。通过分离线程对象和线程方法,简化了线程应用逻辑的开发。
在Java中开发线程有两种方法。第一种方法是由Thread派生一个线程类,实现run方法,并调用Thread.start方法启动线程,如:
class MyThread extends Thread { //创建线程类XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />
public void run() {…} //线程方法
}
MyThread aThread = new MyThread(); //创建一个线程对象
aThread.start() ; //启动线程
第二种方法是通过实现Runable接口创建一个可执行类,并利用一个Thread对象来启动线程,如:
class MyRunable implements Runnable{
public void run() {…} //线程方法
}
MyRunable aRunable = new MyRunable(); //创建一个可执行对象
Thread aThread = new Thread(aRunable); //创建一个线程对象,并与可执行对象关联
aThread.start() ; //启动线程
C#的线程模型将线程对象和线程方法分离得更彻底,它可将任何一个原型为void( )的公有类成员方法(静态或非静态)用作线程方法;另外线程启动时还指定一个提供线程方法的对象(该对象提供线程应用逻辑所需的各种信息)。下面是一个简单的例子:
using System;
using System.Threading;
public class ThreadWork { //ThreadWork不显式继承任何类,DoWork可作为线程方法
public void DoWork() { for(int i = 0; i<10 ;i++) Console.WriteLine("Working thread..."); } //End of DoWork
} //End of ThreadWork
class ThreadTest{
public static void Main() { //将对象aThread 的DoWork方法作为线程方法执行
ThreadWork aThread = new ThreadWork();
ThreadStart myThreadDelegate = new ThreadStart(aThread.DoWork); //指定线程方法
Thread myThread = new Thread(myThreadDelegate); //创建线程对象
myThread.Start(); //启动线程
} //End of
} //End of ThreadTest
开发人员最关心的是如何实现线程方法。Java线程模型提供两种方法来实现线程方法,重载Runable.run方法或者重载Thread.run方法。开发人员可根据具体的应用场合选择合适的基类(Runable或者Thread),这是Java线程模型的一个优点。另外可以看到,Java线程模型中只能在Runable或Thread的子类中实现线程方法(即子类的run方法),而且每个子类只能实现一个线程方法。C#线程模型由于允许将任何一个原型为void( )的公有类成员方法(静态或非静态)用作线程方法,因此它实际上允许在任何一个类(不要求这个类是某个类的子类)中实现线程方法,而且同一个类中可以实现多个线程方法。面向对象的线程模型有两个要素:线程对象和线程方法。线程对象封装线程本身相关的逻辑,如线程的创建、销毁等等。而线程方法就是线程对象实际执行的任务。利用面向对象线程模型进行多线程开发时,这样来思考问题会更自然:现在我有一项工作(即设计了一个线程方法),找一个工人(线程对象)来完成这个工作吧。所以我们认为C#的线程模型更灵活,而这种灵活性使得开发人员能够将程序结构组织的更加清晰、合理。免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341