许多程序,无论大小,都包含或多或少独立于其他段的代码段,如果代码段可以在时间上并行执行效率会更高。线程提供了这种方法。当然,如果像大多数人 一样,你的计算机只有一个处理器,对任意时刻,你不能执行多于一个的计算,但你可以并行地处理输入/输出操作。使用线程的另一个原因是在需要连续运行的程 序中允许同时处理程序中其他的活动,例如,在同一个程序中一个连续运行的动画与另一个活动并行。在web页中 Java的小应用程序在你的浏览器控制下执行,线程使多个小应用程序可以同时一执行。在这种情况下,线程将在浏览器控制下运行的程序分成段以便它好及时运行。如果你只有一个处理器,你的操作系统会造成一个错觉,由于在任意一个给定的时刻只有一个线程可以执行指令,但这是一个非常有效的错觉。为了产生动画,你可以将绘制一系列静止画面的代码放入一个循环中:
通常绘制图像的代码在计时器的控制一下运行,因此是在一个固定的速率下执行,比方说每秒20次。当然,当循环运行时同一个线程中不会发生其他的事。如果你 想有另一个运行的动画,它必须在一个独立的线程中。然后你的操作系统多任务的能力允许两个线程分一享有效的处理器时间,因此,允许两个动画的运行。在第 16章我们将研究如何编写动画程序。 让我们先了解一下线程工作的原理。考虑一个包含三个活动的非常简单的程序:
从文件中读出许多数据块。
现在在线程间有不同种的竞争。读文件和写结果都是在竞争,因此需要有种方法当一个线程已在读取输入文件时,阻止另一个线程从输入文件中读。对输出文件同 理。这个安排有另一个现象与前边版本不同。如果一个线程(比方说是threadl)读一个块(也许是bloclc4 )需要许多时间计算结果,另一个线程(比方说是thread2 )可以想要读下一个块(可能是b1ock5 ),在thread 1为block4写结果前,对block5计算和写结果。在输入的不同次序中如果你不想得到这个结果,你需要做点什么解决这个问题。在我们对确保线程不会 冲突进行研究前,让我们先看看如何创建一个线程。 |