background image

  运行该程序就可以看出,线程

threadone 和 threadtwo 交替占用 CPU,处于并行运行状

态。可以看出,启动线程的

run()方法是通过调用线程的 start()方法来实现的(见上例中主类),

调用

start()方法启动线程的 run()方法不同于一般的调用方法,调用一般方法时,必须等到

一般方法执行完毕才能够返回

start()方法,而启动线程的 run()方法后,start()告诉系统该线

程准备就绪可以启动

run()方法后,就返回 start()方法执行调用 start()方法语句下面的语句,

这时

run()方法可能还在运行,这样,线程的启动和运行并行进行,实现了多任务操作。 

  线程的优先级

 

  对于多线程程序,每个线程的重要程度是不尽相同,如多个线程在等待获得

CPU 时间

时,往往我们需要优先级高的线程优先抢占到

CPU 时间得以执行;又如多个线程交替执行

时,优先级决定了级别高的线程得到

CPU 的次数多一些且时间多长一些;这样,高优先级

的线程处理的任务效率就高一些。

 

  

Java 中线程的优先级从低到高以整数 1~10 表示,共分为 10 级,设置优先级是通过调

用线程对象的

setPriority()方法,如上例中,设置优先级的语句为: 

  

thread1 threadone=new thread1(); file://用 Thread 类的子类创建线程; 

  

Thread threadtwo=new Thread(new thread2()); file://用 Runnable 接口类的对象创建线程;

 

  

threadone.setPriority(6); file://设置 threadone 的优先级 6; 

  

threadtwo.setPriority(3); file://设置 threadtwo 的优先级 3; 

  

threadone.start(); threadtwo.start(); file://strat()方法启动线程; 

  这样,线程

threadone 将会优先于线程 threadtwo 执行,并将占有更多的 CPU 时间。该

例中,优先级设置放在线程启动前,也可以在启动后进行设置,以满足不同的优先级需求。

 

 线程的(同步)控制

 

  一个

Java 程序的多线程之间可以共享数据。当线程以异步方式访问共享数据时,有时

候是不安全的或者不和逻辑的。比如,同一时刻一个线程在读取数据,另外一个线程在处理
数据,当处理数据的线程没有等到读取数据的线程读取完毕就去处理数据,必然得到错误
的处理结果。这和我们前面提到的读取数据和处理数据并行多任务并不矛盾,这儿指的是处
理数据的线程不能处理当前还没有读取结束的数据,但是可以处理其它的数据。

 

  如果我们采用多线程同步控制机制,等到第一个线程读取完数据,第二个线程才能处
理该数据,就会避免错误。可见,线程同步是多线程编程的一个相当重要的技术。

 

  在讲线程的同步控制前我们需要交代如下概念: