一、首先通过例子实现这两种方式。
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接口,这个类可以做很多事情,不仅仅只被用于线程,也可以用于其他功能!
