【IT168技术文档】
线程是允许进行并行计算的一个抽象概念:在另一个线程完成计算任务的同时,一个线程可以对图像进行更新,二个线程可以同时处理同一个进程发出的二个网络请求。我们在这篇文章中将重点讨论Java和C#在线程方面的不同之处,并将一些Java中线程的常用模式转换为C#。
从概念上讲,线程提供了一种在一个软件中并行执行代码的方式━━每个线程都“同时”在一个共享的内存空间中执行指令,(当然是在一个处理器上,这是通过处于运行状态的线程的交替执行完成的。),因此,每个线程都可以访问一个程序内的数据结构。由于这种原因,多线程编程的难度就可想而知了,因为一个程序内有许多不同的线程需要安全地共享数据。
线程的创建和运行
Java在java.lang.Thread和java.lang.Runnable类中提供了大部分的线程功能。创建一个线程非常简单,就是扩展Thread类,并调用start()。通过创建一个执行Runnable()的类,并将该类作为参数传递给Thread(),也可以定义一个线程。仔细地阅读下面这个简单的Java程序,其中有2个线程同时在从1数到5,并将结果打印出来。
public 1; public static void Increment() { Interlocked.Increment( ref x ); }
Interlocked中还包括一个名字为Exchange的方法,可以“不可分割”地将一个变量的值设置为另一个变量的值。
线程池
如果许多利用了线程的应用软件都创建线程,这些线程将会因等待某些条件(键盘或新的I/O输入等)而在等待状态中浪费大部分的时间,C#提供的System.Threading.ThreadPool对象可以解决这一问题。使用ThreadPool和事件驱动的编程机制,程序可以注册一个System.Threading.WaitHandle对象(WaitHandle是C#编程中等待和通知机制的对象模型。)和System.Threading.WaitOrTimerCallback对象,所有的线程无需自己等待WaitHandle的释放,ThreadPool将监控所有向它注册的WaitHandle,然后在WaitHandle被释放后调用相应WaitOrTimerCallback对象的方法。
结束语
在本篇文章中我们简单地讨论了C#提供的用于线程和并行操作的机制,其中的大部分与Java相似━━C#提供了可以运行提供的方法的Thread对象,同时提供了对代码访问进行同步的方法。与在其他方面一样,C#在线程方面也提供了一些Java不支持的语法(在一定程度上,揭示了同步操作的一些底层的内容。)