计算机二级考试JAVA基础知识:线程

 1 理解线程

计算机二级考试JAVA基础知识:线程

许多程序,无论大小,都包含或多或少独立于其他段的代码段,如果代码段可以在时间上并行执行效率会更高。线程提供了这种方法。当然,如果像大多数人一样,你的计算机只有一个处理器,对任意时刻,你不能执行多于一个的计算,但你可以并行地处理输入/输出操作。使用线程的另一个原因是在需要连续运行的程序中允许同时处理程序中其他的活动,例如,在同一个程序中一个连续运行的动画与另一个活动并行。在web页中 Java的小应用程序在你的浏览器控制下执行,线程使多个小应用程序可以同时一执行。在这种情况下,线程将在浏览器控制下运行的程序分成段以便它好及时运行。如果你只有一个处理器,你的操作系统会造成一个错觉,由于在任意一个给定的时刻只有一个线程可以执行指令,但这是一个非常有效的错觉。为了产生动画,你可以将绘制一系列静止画面的代码放入一个循环中:

通常绘制图像的代码在计时器的控制一下运行,因此是在一个固定的速率下执行,比方说每秒20次。当然,当循环运行时同一个线程中不会发生其他的事。如果你想有另一个运行的动画,它必须在一个独立的线程中。然后你的操作系统多任务的能力允许两个线程分一享有效的处理器时间,因此,允许两个动画的运行。在第16章我们将研究如何编写动画程序。

 2 管理线程

在这章的两个例子中我们看到,线程被启动,然后竞争计算机资源。因为三个线程对处理器的竟争采用不受控制的方法,所以线程的输出次序混乱。在程序中通常这是不希望看到的。在绝大多数使用线程的例子中,线程执行的方法需要被管理才能使线程彼此不产生冲突。

当然,在我们的例子中,程序被故意构造成通过输出一个名字中途释放处理器的控制。

虽然这是非常做作的,但类似情况也会在现实中出现,特别是在重复操作的线程中出现。能够认识到当一个原始语句执行时一个线程能被中断是很重要的'。例如:假设一个线程执行语句:

i=i+1

在这个语句仍在执行时,线程的执行被中断是极有可能的,也许存i值被取来增1之后,但在结果被存回i之前。没有适当控制,另一个访问i的线程会在这一时刻改变i的值:结果是在这个线程中i没有增1.

两个或多个线程分享一个公用资源的地方,如文件或内存块,你需要决策确保一个线程不能修改另一个线程正在使用的资源。当一木线程更新文件中的一个记录时而另一个线程中途检索同一个记录是带来灾难的方法。管理这种情况的一个方法是使用线程中包含的同步(synchronization)

同步

同步的目标是当几个线程想访问同一个资源时,确保在仟何指定时刻只能有一个线程访问它。用同步管理你的线程执行有两种方法;

在方法一级管理代码,包括同步方法

在块一级管理代码一使用同步块

首先我们看看怎么使用同步方法。

 3 线程优先级

所有的线程都有一个优先级,当几个线程正等待机会时决定应该执行哪个。这使得可能一个线程可以比另一个得到更多的对处理器资源的访问。让我们考虑一个如何使用优先级的基本例子。假设你有一个某程序中的线程,该程序需要所有的处理器资源--某些又难又长的计算。另一些线程需要的资源相对较少。通过将需要所有资源的线程设置成低优先级,你可以确保其他的线程可以立即执行,而被线程约束的处理器在其他线程轮流处理之后剩下的处理周期处理该线程。

private list inTray (new LinkedList());

private int maxTransactions //Max transaction in the intray

注意我们从构造函数中删除了将inTray初始化成null的语句:现在我们是针对一个表,我们必须改写Clerk类中的doTransaction方法只要表中交易数少于MaxTransactions,就向表中存储交易。这里被修改的代码如下:

while(()>=maxTrarsactions)

Try

{

wail();

println;

{

)transaction);

表的size()方法返回表中包含的对象个数,因此检查这个是件无关紧要的事。我们使用add()方法在表尾添加一个新的Transaction对象。

职员调用run()方法从输入托盘中检索对象。因此为了处理表,我们必须更新该方法。

线程是一个程序中的子任务,可以并行执行。