二、 在Java中实现多线程
每个程序至少自动拥有一个线程,称为主线程。当程序加载到内存时,启动主线程。Java 程序中的public static void main( )方法是主线程的人口,运行Java程序时,会先执行这个方法。
开发中, 用户编写的线程般都是指除了主线程之外的其他线程。
使用一个线程的过程,可以分为4个步骤:
(1)定义一个线程,同时指明这个线程所要执行的代码,即期望完成的功能。
(2)创建线程对象。
(3)启动线程。
(4)终止线程。
定义一个线程类通常有两种方法,分别是继承java.lang.Thraed类和实现ava.lang.Runnable接口。
2.1使用Thread类创建线程
Java提供了java.lang. Thread类支持名线程编程,该类提供了大量的方法来控制和操作线程,如表2-1所示。这些方法可以先初步了解,后面使用到时再深人学习。
表2-1 Thread类常用方法
方法 | 说明 |
void run( ) | 执行任务操作的方法 |
void start( ) | 使该线程开始执行 |
void sleep(long millis) | 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行) |
String getName( ) | 返回该线程的名称 |
int getPriority() | 返回线程的优先级 |
void setPriority(int newPriority) | 更改线程的优先级 |
Thread.State getState() | 返回该线程的状态 |
boolcean isAlive( ) | 测试线程是否处于活动状态 |
void join( ) | 等待该线程终止 |
void interrupt( ) | 中断线程 |
void yield() | 暂停当前正在执行的线程对象,并执行其他线程 |
创建线样时继承Thread 类并重写Thread类的run( )方法。Thread 类的run( )方法是线程要执行操作任务的方法,所以线程要执行的操作代码都需要写在run( )方法中,并通过调用start( )方法来启动线程。
示例1
使用继承Thread类的方式创建线程,在线程中输出1~100的整数。
实现步骤:
(1)定义MyThread类继承Thread类,重写run( )方法, 在run( )方法中实现数据输出.
(2)创建线程对象。
(3)调用start( )方法启动线程。
关键代码:
//通过继承Thread类来创建线程
public class MyThread extends Thread{
private int count=0;
//重写run()方法
public void run(){
while (count<100) {
count++;
system.out.println ("count的值是: "+count);
}
}
}
//启动线程
publlc class Test{
public static vold main(String args){
//实例化线程对象
MyThread mt = new MyThread();
//启动线程
mt.start();
}
}
由示例1可以看出,创建线程对象时将不会开启线程,必须到用线是对象的start( )方法才能使线程开始执行。
2.2使用Runnable接口创建线程
使用继承Thread类的方式创建线程简单明了,符合大家的习惯,但它也有一个缺点, 如果定义的类已经继承其他类则无法再继承Thread类。使用Runnable接口创建线程的方式可以解决上述问题。Runnable接口中声明了一个run( )方法,即public void run()。一个类可以通过实现 Runmable接口并实现其run( )方法完成线程的所有活动,已实现的run( )方法称为该对象的线程体。任何实现Runnable接口的对象都可以作为一个线程的目标对象。
示例2
使用实现Runnable接口的方式创建线程,在线程中输出1~100的整数。
实现步骤:
(1)定义MyThread类实现java.lang.Runnable接口,并实现Runnable接口的run( )方法,在run( )方法中实现输出数据。
(2)创建线程对象。
(3)调用star( )方法启动线程,
关键代码:
//通过实现Runnable楼口创建线程
publie class MyThread implements Runnable{
private int count = 0;
//实现run()方法
public void run(){
while (count<100){
count++;
System .out .printin("count的值是: "+count);
}
}
}
//启动线程
public class Test{
publie statie vold main(string args){
//创建线程对象,将实现Runnable的线程类对象作为参数
Thread thread = new Thread(new MyThread());
//启动线程
thread.start();
}
}
示例2中,通过Thread tread=new Thread(new MyThread( ))创建线程对象。
两种创建线程的方式有各白的特点和应用领域:直接继承Thread类的方式编写简单,可以直接操作线程,适用于单重继承的情况;实现Runnable接口的方式,当一个线程继承了另一个类时,就只能用实现Runnable 接口的方法来创建线程,而且这种方式还可以使名个线程之间使用同一个Runnable对象。