APP下载

Java语言与C#语言的多线程编程能力和差异

2012-08-15黑龙江吴文庆修雅慧

职业技术 2012年4期
关键词:调用线程编程

黑龙江 吴文庆 修雅慧

Java语言与C#语言的多线程编程能力和差异

黑龙江 吴文庆 修雅慧

Java与C#是现今网络开发的两大主要平台,而多线程编程则是进行并行处理计算中的基础,本文主要阐述了在Java与C#开发平台下如何进行多线程编程的方法及注意事项,并且比较和分析两种开发平台下进行多线程编程的差异。

多线程;并行处理;Java;C#

从概念上讲,线程提供了一种在一个软件中并行执行代码的方式——每个线程都“同时”在一个共享的内存空间中执行指令(当然是在一个处理器上,这是通过处于运行状态的线程的交替执行完成的),因此,每个线程都可以访问一个程序内的数据结构。由于这种原因,多线程编程的难度就可想而知了,因为一个程序内有许多不同的线程需要安全地共享数据。

一、线程的创建和运行

Java在Java.lang.Thread和Java.lang.Runnable类中提供了大部分的线程功能。创建一个线程非常简单,就是扩展Thread类,并调用start()。通过创建一个执行Runnable()的类,并将该类作为参数传递给Thread(),也可以定义一个线程。

下面这个简单的Java程序,其中有2个线程同时在从1数到5,并将结果打印出来。

public class ThreadingExample extends Object

public static void main(Stringargs[]){

Thread[]threads=new Thread[2];

for(int count=1;count<=threads.length;count){

threads[count]=new Thread(new Runnable()

{

public void run(){

count();

}}

threads[count].start();

}}

public static void count(){

for(int count=1;count<=5;count)

System.out.print(count””);

}

}

可以使用System.Threading.Thread和System.Threading.ThreadStart两个类将上述的Java程序转换为C#语言:

using System.Threading;

public class ThreadingExample:Object{

public static void Main(){

Thread[]threads=new Thread[2];

for(int count=1;count<=threads.Length;count){

threads[count」=new Thread(new ThreadStart(Count));

threads[count].Start();

}

}

public static void Count(){

for(int count=1;count<=5;count)

Console.Write(count””);

}

}

二、线程的使用

Java中存在许多编程人员希望能够对线程使用的标准操作:例如,测试线程是否存在、加人一个线程直到它死亡、杀死一个线程等。

Java中java.lang.Thread中的方法和C#中System.Threading.Thread对象的对比:

setDaemon(boolean on)方法:IsBackground设置属性值使一个存在的进程成为一个新线程(如果剩下的所有进程都成了新线程,程序将停止运行)。

isDaemon()方法:IsBackground 获取属性,如果该线程是一个后台线程,则返回真值。

isAlive()方法:IsAlive获取属性,如果该线程处于活动状态,则返回真值。

Interrupt()方法:尽管在Java中这一方法可以用来设置线程的中断状态,而且可以用来检查线程是否被中断。在C#中没有相应的方法,对一个没有处于阻塞状态的线程执行Interrupt方法将使下一次阻塞调用自动失效。

isInterrupted()方法:n/a,如果该线程处于阻塞状态,则返回真值。

sleep(long millis) 和 sleep(long millis,intnanos),Sleep (int millisecond Timeout)and Sleep(System.TimeSpan)方法:使正在执行的线程暂停一段给定的时间,或直到它被中断。这一方法将在Java中将产生一个java.lang.InterruptedException状态,在C#中将产生System..Threading.ThreadInterruptedException状态。

Join(),join(long millis)和 join(long millis,intnanos)方法与Java中仅依靠超时设定不同的是,在C#语言中则依据线程停止运行是由于线程死亡(返回真)或是超时(返回假)而返回一个布尔型变量。

Suspend()方法:二者的功能相同。这一方法容易引起死循环,如果一个占有系统关健资源的线程被挂起来,则在这一线程恢复运行之前,其他的线程不能访问该资源。

Resume()方法:恢复一个被挂起的线程。

Stop()方法,Abort()方法:参见下面的“线程中止”部分。

三、线程的中止

由于能够在没有任何征兆的情况下使运行的程序进人一种混乱的状态,Java中的Thread.stop受到了普遍的反对。根据所调用的stop()方法,一个未经检查的Java.lang.ThreadDeath错误将会破坏正在运行着的程序的栈,随着它的不断运行,能够解除任何被锁定的对象。由于这些锁被不分青红皂白地被打开,由它们所保护的数据就非常可能陷人混乱状态中。根据当前的Java文档,推荐的中止一个线程的方法是让运行的线程检查一个由其他的线程能够改变的变量,该变量代表一个“死亡时间”条件。

上述的讨论对C#中的Abort方法也适合。根据调用的Abort方法,System.Threading.ThreadAbortException可能会破坏线程的栈,它可能释放线程保持的一些变量,使处于保护状态中的数据结构出现不可预测的错误。我建议使用与上面所示的相似的方法来通知一个应该死亡的线程。

四、结束语

本文章中重点讨论了Java和C#在多线程编程方面的具体实现方法,阐述了两者实现的不同之处,并实现了Java中多线程编程的常用模式转换为C#。

[1]Bruce Eckel(陈昊鹏,译).Java编程思想(第4版)[M].北京:机械工业出版社,2007.

[2]Kathy Sierra,Bert Bates.深入浅出Java[M].影印版·南京:东南大学出版社,2005.

[3]Cay S.Hoistmann,Gary cornell(陈昊鹏,王浩,姚建平,等译).Java 2核心技术[M].北京:机械工业出版社,2006.

(编辑 李艳华)

(作者单位:吴文庆,齐齐哈尔工程学院;修雅慧,齐齐哈尔医学院)

猜你喜欢

调用线程编程
基于C#线程实验探究
编程,是一种态度
元征X-431实测:奔驰发动机编程
编程小能手
纺织机上诞生的编程
基于国产化环境的线程池模型研究与实现
核电项目物项调用管理的应用研究
线程池调度对服务器性能影响的研究*
系统虚拟化环境下客户机系统调用信息捕获与分析①
利用RFC技术实现SAP系统接口通信