线程的建立有两种方式,分别是继承Thread类和实现Runnable接口,那么这两种方式有什么相同点,以及区别在何处呢?java
首先经过两个实例还看一下他们的相同之处:编程
实例1:使用继承Thread类多线程
建立子类MultiExtendThread: ide
public class MultiExtendThread extends Thread { private int ticket = 10;//每一个线程拥有10张票 private String name; MultiThread3(String name) { this.name = name; } public void run() { while (ticket > 0) { System.out.println(ticket-- + " is saled by " + name); } } }
测试类: 测试
public static void main(String[] args) { MultiExtendThread m1 = new MultiExtendThread ("Window 1"); MultiExtendThread m2 = new MultiExtendThread ("Window 2"); MultiExtendThread m3 = new MultiExtendThread ("Window 3"); //建立3个线程 Thread t1 = new Thread(m1 ); Thread t2 = new Thread(m2); Thread t3 = new Thread(m3); t1.start(); t2.start(); t3.start(); }
测试结果:以多线程的形式各自打印出售票信息,每一个线程分别打印10条记录,以下:this
实例2:使用实现Runnable接口方式spa
实现Runnable接口的类: 线程
public class MultiThread1 implements Runnable { private int ticket = 10;//每一个线程都拥有10张票 private String name; MultiThread1(String name) { this.name = name; } public void run() { while (ticket > 0) { System.out.println(ticket-- + " is saled by " + name); } }
测试类: code
public static void main(String[] args) { MultiThread1 m1 = new MultiThread1("Window 1"); MultiThread1 m2 = new MultiThread1("Window 2"); MultiThread1 m3 = new MultiThread1("Window 3"); //建立3个线程 Thread t1 = new Thread(m1 ); Thread t2 = new Thread(m2); Thread t3 = new Thread(m3); t1.start(); t2.start(); t3.start(); }
测试结果同实例1对象
经过以上两个实例,来看一下二者的相同之处:
均可以保证新建线程彼此相互独立,各自拥有资源,互补干扰。在这样的场景先,不管使用哪一种形式均可以。
不一样之处:
java的一个特性是仅支持单继承,这样若是是经过继承Thread来实现多线程时,该类将没法再扩展其余的类,不能实现负责的功能。而使用实现Runnable接口时,一样还能够实现其余的接口,这样就避免单继承所带来的局限。还有一点是,实现Runnable接口建立的线程还能够处理同一资源,实现资源的共享。
实例3:多个售票窗口能够共同售10张票
public class MultiThread2 implements Runnable { private int ticket = 10; @Override public void run() { while (ticket > 0) { System.out.println(ticket-- + " is saled by " + Thread.currentThread().getName()); } } }
测试类:
public static void main(String[] args) { //建立一个实例 MultiThread2 m = new MultiThread2(); //建立三个线程,三个线程共同拥有同一个实例 Thread t1 = new Thread(m, "Window 1"); Thread t2 = new Thread(m, "Window 2"); Thread t3 = new Thread(m, "Window 3"); t1.start(); t2.start(); t3.start(); }
实例结果:
总结:
采用继承Thread类方式: (1)优势:编写简单,若是须要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,便可得到当前线程。 (2)缺点:由于线程类已经继承了Thread类,因此不能再继承其余的父类。 采用实现Runnable接口方式: (1)优势:线程类只是实现了Runable接口,还能够继承其余的类。在这种方式下,能够多个线程共享同一个目标对象,因此很是适合多个相同线程来处理同一份资源的状况。 (2)缺点:编程稍微复杂,若是须要访问当前线程,必须使用Thread.currentThread()方法。