1. 概述
线程不仅仅局限于操作系统中,在程序设计语言、数据库管理系统和其他的一些应用软件中,也可以通过引入线程来改善系统和应用程序的性能。
在一个进程中包含多个并行执行的控制流,而不是把多个可并发执行的控制流一一分散在多个进程中,这是并发线程程序设计与并发多进程程序设计的不同之处。并发多线程程序设计的主要优点是使系统性能获得很大的提高,具体表现为快速切换线程、减少系统管理的开销、线程通信易于实现、并发程度高、节省内存空间。
JAVA支持内置的多线程机制。JAVA语言包中的 java.lang.Thread类具有封装线程的能力,它提供了创建、管理和控制线程对象的重要方法。
2. 实现JAVA线程的两种方法
之前的JAVA程序运行时,进程由main()方法开始执行,进程中只有一个线程,这就是main线程,也称为主线程。当在main()方法中创建多个线程对象并启动线程执行对象时,进程中则包含了多个线程并发地执行。
JAVA的java.lang.Thread类用于创建和控制线程。线程对象由Thread类及其子类声明,线程对象的执行方法是java.lang.Runnable接口中的run()方法。就像应用程序必须从main开始执行一样,一个线程必须从run()方法开始执行。
实现线程可有下面两种方法:
1) 继承Thread类
举一个例子如下:声明自定义的线程类NumberThread继承Thread类,其中的成员变量k设置为序列初始值,run()方法覆盖了Thread类的run方法,提供线程的执行体,输出一个奇数(偶数)序列。程序如下:
public class NumberThread extends Thread
{
private int k;
public NumberThread(String name, int k)
{
super(name);
this.k = k;
}
public NumberThread(String name)
{
this(name,0);
}
public void run()
{
int i = k;
System.out.println("/n" + this.getName() +": ");
while(i < 50)
{
System.out.println(i + " ");
i += 2;
}
System.out.println(this.getName() + "结束");
}
public static void main(String args[])
{
NumberThread threadOdd = new NumberThread("奇数线程",1);
NumberThread threadEven = new NumberThread("偶数线程",2);
threadOdd.start();
threadEven.start();
System.out.println("activeCount = " + threadEven.activeCount());
}
}
2) 实现Runnable接口
本类通过Runnable接口来实现上面例子的功能。程序如下:
public class NumberRunnable implements Runnable
{
private int k;
public NumberRunnable(int k)
{
this.k = k;
}
public NumberRunnable()
{
this(0);
}
@Override
public void run()
{
// TODO Auto-generated method stub
int i = k;
while(i < 50)
{
System.out.println(i+ " ");
i += 2;
}
System.out.println("结束!");
}
public static void main(String args[])
{
NumberRunnable odd = new NumberRunnable(1);
Thread threadOdd = new Thread(odd,"奇数线程");
NumberRunnable even = new NumberRunnable();
Thread threadEven = new Thread(even,"偶数线程");
threadOdd.start();
threadEven.start();
}
}
每次运行程序,程序的输出结果都不一样。线程是有CPU来调度执行的,程序不能控制线程运行的先后。
3. 两种方法的比较
直接继承线程Thread类:自定义一个线程类需要声明继承Thread类,并且必须覆盖Thread类的run()方法,直接说明线程对象执行的操作。这种方法适用于单重继承,不适合于多重继承。好处是,Thread类的子类具有Thread类声明的方法,其对象是线程对象可以直接控制和操作。
实现Runnable接口:在需要多重继承的情况下,就只能用实现Runnable 接口方式。一个声明实现Runnable接口的类,本身不是线程对象,同时还需要再声明线程对象,因此,实现Runnable接口的类的对象是作为一个线程对象的目标对象使用的。