Java、C#线程模型分析对比

原创 2003年06月02日 17:51:00

       JavaC#都提供了面向对象的线程模型。它们都抽象出了线程对象,而开发人员在某个类的成员方法中实现线程应用逻辑。通过分离线程对象和线程方法,简化了线程应用逻辑的开发。

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 <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />Main

  }  //End of  ThreadTest

开发人员最关心的是如何实现线程方法。Java线程模型提供两种方法来实现线程方法,重载Runable.run方法或者重载Thread.run方法。开发人员可根据具体的应用场合选择合适的基类(Runable或者Thread),这是Java线程模型的一个优点。另外可以看到,Java线程模型中只能在RunableThread的子类中实现线程方法(即子类的run方法),而且每个子类只能实现一个线程方法。C#线程模型由于允许将任何一个原型为void( )的公有类成员方法(静态或非静态)用作线程方法,因此它实际上允许在任何一个类(不要求这个类是某个类的子类)中实现线程方法,而且同一个类中可以实现多个线程方法。面向对象的线程模型有两个要素:线程对象和线程方法。线程对象封装线程本身相关的逻辑,如线程的创建、销毁等等。而线程方法就是线程对象实际执行的任务。利用面向对象线程模型进行多线程开发时,这样来思考问题会更自然:现在我有一项工作(即设计了一个线程方法),找一个工人(线程对象)来完成这个工作吧。所以我们认为C#的线程模型更灵活,而这种灵活性使得开发人员能够将程序结构组织的更加清晰、合理。

Java线程模型、线程状态 - 线程(1)

1. 概述众所周知,线程 - Thread 是比进程 - Progress 更轻量级的调度单位。简单来说,引入线程带来的好处是: 可以把一个进程 的资源分配和执行调度分开,各个线程 既可以共享进程...
  • u010297957
  • u010297957
  • 2016年05月06日 15:26
  • 2120

Netty5源码分析(二) -- 线程模型分析

线程模型是Netty的核心设计,设计地很巧妙,之前项目中有一块处理并发的设计和Netty的Eventloop单线程设计类似,效果得到了实证。 Netty5的类层次结构和之前的版本变化很大,网上也有...
  • ITer_ZC
  • ITer_ZC
  • 2014年09月18日 18:11
  • 4367

EventBus源码分析(四):线程模型分析(2.4版本)

EventBus有四种线程模型 PostThread模式不需线程切换,直接在发布者线程进行事件处理。 MainThread模式分类讨论:发布者线程是主线程则直接调用事件处理方法,否则通过Handler...
  • shihui512
  • shihui512
  • 2016年07月05日 19:59
  • 888

挺有意思的比较,JAVA与C#。

写之前,先声明,我很菜,又很懒。事出有因,先看下原因。我想通过网络由JAVA向C#里传递一个文件,由于我很懒,选择了Web Service,还只想传简单类型,于是,我想起了base64,于是我就决定用...
  • runmin
  • runmin
  • 2004年08月06日 16:51
  • 2290

线程的概念和模型以及与进程的比较

本博客前面部分转自:http://c.biancheng.net/cpp/html/2593.html 线程的基本概念 引入进程的目的,是为了使多道程序并发执行,以提高资源利用率和系统吞吐量;而引...
  • FreeeLinux
  • FreeeLinux
  • 2016年12月18日 12:56
  • 607

Linux线程模型比较

转载自https://www.ibm.com/developerworks/cn/linux/l-threading.html 进行移植的开发人员需要了解的关键区别摘要LinuxThreads 项目...
  • derkampf
  • derkampf
  • 2017年03月03日 21:39
  • 724

Java如何实现音频对比

这个可以用FFT(Fast Fourier Transform)将time domain的音频转换到Frequency domain,即得到音频的频谱,在比较两者的频谱即可。比如一个人讲话的声音都是有...
  • knight0513
  • knight0513
  • 2012年02月24日 10:31
  • 3588

C# Task 多线程

Task类在命名空间System.Threading.Tasks下,通过Task的Factory返回TaskFactory类,以TaskFactory.StartNew(Action)方法可以创建一个...
  • wshl1234567
  • wshl1234567
  • 2016年03月07日 17:07
  • 291

Java多线程模型

谈到Java多线程就涉及到多线程的模型及Java线程与底层操作系统之间的关系。正如我们熟知,现代机器可以分为硬件和软件两大块,如图2-5-1-1,硬件是基础,软件提供实现不同功能的手段。而且软件可以分...
  • wangyangzhizhou
  • wangyangzhizhou
  • 2014年11月08日 22:50
  • 4179

java线程深度解析(三)——并发模型(Future)

多核CPU充分利用CPU性能,就需要使用多线程并行挖掘CPU的潜力,并行程序设计对常用的多线程结构进行抽象,总结出几种典型多线程开发设计模式。 一、future 模式——精彩无需等待      当程...
  • Daybreak1209
  • Daybreak1209
  • 2016年05月10日 21:56
  • 2247
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java、C#线程模型分析对比
举报原因:
原因补充:

(最多只允许输入30个字)