Java是第一个在语言级提供了对多线程程序设计支持的语言。语言级支持是啥意思呢,就是抛开操作系统,只使用Java内置的语句就能实现多线程。一般来讲,多线程会依赖操作系统,我们要高用与系统相关的API才能创建多个线程,如在Windows中的CreateThread()函数。但JAVA就不用了。JAVA运行时系统实现了一个用于调用线程执行的线程调度器,用来决定在某一时刻哪个线程在CPU上运行。
在java技术中,线程通常是抢占式的而不需要时间片分配进程(分配给每个线程相等的CPU时间的进程)。抢占式调度模型就是许多线程处于可以运行状态(等待状态),但实际上只有一个线程在运行。该线程一直运行到它终止进入可运行状态(等待状态),或者另一个具有更高优先级的线程变成可运行状态。在后一种情况下,低优先级的线程被高优先级的线程抢占,高优先级的线程获得运行的机会。线程调度器支持不同优先级线程的抢先方式,但其本身不支持相同优先级线程的时间片轮换。若要想让其支持,则必须将运行时系统运行在支持时间片轮换操作系统上。
1、Thread类和Runnable接口
在Java中实现多线程可以有2种方式,一个是让类继承Thread类,另一个是实现Runnable接口。由于Java不允许多继承,所以当我们让自定义的类继承了Thread类后就不能再继承其它类了,这样会降低日后程序的可扩展性。所以一般我们都是采用实现Runnable接口的方法让一个类具有可执行的特性。
Runnable接口只有一个方法run(),该线程启动时,JVM就会调用run()方法以执行该线程。线程类创建后,必须调用start()方法才能启动线程。如:
package cls;
public class ThreadDemo
{
public static void main(String[] args)
{
//创建线程类对象并实现 Runnable接口
Thread th1 = new Thread(new Runnable()
{
// 实现Runnable中的run()方法
public void run()
{
while(true)
System.out.println("Thread1 is running !");
}
});
Thread th2 = new Thread(new Runnable()
{
public void run()
{
while(true)
System.out.println("Threa