Java中创建线程到两种方法

首先,按照线程的模型,一个具体的线程也是由虚拟的cpu、代码与数据组成,其中代码与数据构成了线程体,线程体决定了线程到行为。虚拟的cpu是在创建线程时由系统自动封装进Thread类到实例中,而线程体要应用程序通过一个对象传递给Thread类的构造函数。Java中到线程体是由线程类的run()方法定义,在该方法中定义线程的具体行为。线程开始执行时,也是从它的run()方法开始执行。
下面看一下Thread类的构造方法。

1
public Thread(ThreadGroup group,Runnable target,String name);

其中group是指明该线程所属的线程组;target提供线程体的对象。java.lang.Runnable接口中定义了run()方法。实现该接口的类的对象可以提供线程体,线程启动时该对象的run()方法将被调用;name线程名称。

言归正传,线程创建中,线程体的构造是关键。任何实现Runnable接口的对象都可以作为Thread类构造方法中的target参数,而Thread类本身也实现了Runnable接口,因此可以有两种方式提供run方法的实现:实现Runnable接口和继承Thread类。

通过实现Runnable接口创建线程

在java.lang中Runnable接口的定义为:

1
2
3
public interface Runnable{
void run();
}

使用这种方法创建线程的步骤是:
1.定义一个线程类实现Runnable接口,即在该类中提供run()方法的实现。
2.把Runnable的一个实例作为参数传递给Thread类的一个构造方法,该实例对象提供线程体run().
下面给一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ThreadTest {
public static void main(String args[]){
Thread t1 = new Thread( new Hello());
Thread t2 = new Thread(new Hello());
t1.start();
t2.start();
}
}

class Hello implements Runnable{
int i;
public void run(){
while(true){
System.out.println("Hello "+i++);
if(i == 5)
break;
}
}
}

该例中,Hello类实现了Runnable接口,在ThreadTest类的main方法中,以Hello类的两个实例对象分别创建了t1,t2两个线程,并将线程启动。在创建的线程中,Hello类的run()方法就是线程体,int i是线程的数据,当t1,t2启动时,就从Hello类对象的run()方法开始执行。

通过继承Thread类创建线程

在java.lang包中,Thread类的声明如下:

1
public class Thread extends Object implements Runnable

因此,Thread类本身实现了Runnable接口,在Thread类的定义中可以发现run()方法
通过继承Thread类创建线程的步骤是:
1.从Thread类派生子类,并重写其中的run()方法定义线程体。
2.创建该子类的对象创建线程。
下面给出一个简单的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class ThreadTest2 {
public static void main(String args[]){
Hello2 t1 = new Hello2();
Hello2 t2 = new Hello2();
t1.start();
t2.start();
}
}

class Hello2 extends Thread{
int i;
public void run(){
while(true){
System.out.println("Hello "+i++);
if(i == 5)
break;
}
}
}

在例中,类Hello2继承了Thread类,并将Thread类的run()方法进行了重写,run()方法的功能与上个例子中的线程相同。
另外,新建的线程不会自动运行。必须调用线程的start()方法。该方法的调用把嵌入在线程中的虚拟CPU置为可运行状态,意味着它可被调度运行,但这并不意味着线程会立即运行

小结:线程是java中很重要的一部分,线程的两种创建方法一定要熟悉。