运行该程序就可以看出,线程
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 程序的多线程之间可以共享数据。当线程以异步方式访问共享数据时,有时
候是不安全的或者不和逻辑的。比如,同一时刻一个线程在读取数据,另外一个线程在处理
数据,当处理数据的线程没有等到读取数据的线程读取完毕就去处理数据,必然得到错误
的处理结果。这和我们前面提到的读取数据和处理数据并行多任务并不矛盾,这儿指的是处
理数据的线程不能处理当前还没有读取结束的数据,但是可以处理其它的数据。
如果我们采用多线程同步控制机制,等到第一个线程读取完数据,第二个线程才能处
理该数据,就会避免错误。可见,线程同步是多线程编程的一个相当重要的技术。
在讲线程的同步控制前我们需要交代如下概念: