在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口,下面通过具体代码来看它们的区别
(1)继承Thread实现多线程
package cn.com.thread.demo; class MyThread1 extends Thread { private String name; public MyThread1(String name) { super(); this.name = name; } public void run() { for(int i = 0; i < 100; i ++) { System.out.println("线程开始:"+ this.name +",i="+i); } } } public class ThreadDemo01 { public static void main(String[] args) { MyThread1 mt1 = new MyThread1("线程a"); MyThread1 mt2 = new MyThread1("线程b"); /*直接调用类的方法,结果是跟调用普通类的方法一样,执行完一个,再执行另一个,达不到多线程工作的效果*/ //mt1.run(); //mt2.run(); /*用start()方法启动线程*/ mt1.start(); mt2.start(); } }
(2)实现Runnable接口产生多线程
package cn.com.thread.demo; class MyThread2 implements Runnable { private String name; public MyThread2(String name) { this.name = name; } public void run() { for(int i = 0; i < 100; i ++) { System.out.println("线程开始:"+ this.name +",i="+i); } } } public class RunnableThread { public static void main(String[] args) { MyThread2 mt1 = new MyThread2("线程a"); MyThread2 mt2 = new MyThread2("线程b"); /*但是在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。 此时观察Thread类,有一个构造方法:public Thread(Runnable targer) 此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。*/ new Thread(mt1).start(); new Thread(mt2).start(); /*或者下面的写法*/ /*Thread t1 = new Thread(mt1); Thread t2 = new Thread(mt2); t1.start(); t2.start();*/ } }
(3)Thread 和Runnable 两种实现方式的区别和联系:
在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:
避免点继承的局限,一个类可以继承多个接口。
适合于资源的共享
以卖票程序为例,通过Thread类完成:
package cn.com.thread.demo; class MyThread3 implements Runnable { private int ticket = 50; public void run() { for (int i = 0; i < 60; i ++) { if(this.ticket > 0) { System.out.println("卖票:ticket" + this.ticket--); } } } } public class ThreadTicket { public static void main(String[] args) { MyThread3 mt = new MyThread3(); /*在Runnable生成的线程中可以用一个实例在多个线程中调用*/ new Thread(mt).start(); new Thread(mt).start(); new Thread(mt).start(); } }