一、首先通过例子实现这两种方式。
1、继承Thread类。
Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了。
首先新建一个MyThread类继承自Thread类,重写run()方法,在控制输入传递的文本,
public class MyThread extends Thread {
private String name;
public MyThread(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println("MyThread is " + name);
}
}
接着创建该类,启动该线程(Thread类的start()方法),并输出线程的id,
public class Test1 {
public static void main(String[] args){
MyThread myThread1=new MyThread("线程1");
MyThread myThread2=new MyThread("线程2");
MyThread myThread3=new MyThread("线程3");
myThread1.start();
myThread2.start();
myThread3.start();
System.out.println("myThread1 id ="+myThread1.getId()); System.out.println("myThread1 id ="+myThread2.getId()); System.out.println("myThread1 id ="+myThread3.getId()); } }
开启了三个线程。并输出线程的id,
2、实现Runnable接口。
Runnable只是一个接口,它里面只有一个run()方法,没有start()方法,
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
所以,实现Runnable接口后,需要使用Thread类来启动。
public class MyRunnable implements Runnable {
private String name;
public MyRunnable(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println("MyRunnable is " + name);
}
}
下面还是上案例说明,
- public class Test1 {
- public static void main(String[] args){
- MyRunnable myRunnable1=new MyRunnable("Runnable1");
- MyRunnable myRunnable2=new MyRunnable("Runnable2");
- MyRunnable myRunnable3=new MyRunnable("Runnable3");
- Thread myThread1=new Thread(myRunnable1);
- myThread1.start();
- System.out.println("myThread1 id ="+myThread1.getId());
- Thread myThread2=new Thread(myRunnable2);
- myThread2.start();
- System.out.println("myThread1 id ="+myThread2.getId());
- Thread myThread3=new Thread(myRunnable3);
- myThread3.start();
- System.out.println("myThread1 id ="+myThread3.getId());
- }
- }
可以看到,启动了三个不同的线程。
小结:通过上面的两个小例子程序,我们可以得知,只是实现Runnable接口,并不能启动或者说实现一个线程。Runnable接口,并不能代表一个线程。Runnable接口和线程是两个不同的概念!
换句话说,一个类,实现Runnable接口,这个类可以做很多事情,不仅仅只被用于线程,也可以用于其他功能!