开始学线程的时候总会写一些简单的小程序,例如:4个窗口卖20张票。
当然用Thread实现类和Runnable实现类都能实现,但是两者是有异同的:
前者在开启线程的时候还会新开启一个自身的任务,所以用Thread子类创建的线程,会是各个线程交替去执行自己的任务,而非共同执行一条任务。
后者只会创建一个任务,让多个线程去执行一个任务。
平时一般用Runnable声明线程。
继承Runnable
public class SaleTicketsOfRunnable { public static void main(String[] args) { Sales s= new Sales(); Thread t1 = new Thread(s,"一口"); Thread t2 = new Thread(s,"二口"); Thread t3 = new Thread(s,"三口"); Thread t4 = new Thread(s,"四口"); t1.start(); t2.start(); t3.start(); t4.start(); } } class Sales implements Runnable{ int tickets = 20; String name; @Override public void run() { while(tickets>0){ System.out.println(Thread.currentThread().getName()+"卖了第【"+this.tickets--+"】张火车票"); } } }
继承Thread
public class SaleTicketsOfThread { public static void main(String[] args) { new Sale().start(); new Sale().start(); new Sale().start(); new Sale().start(); } } class Sale extends Thread{ private int tickets = 20;//不加static则是四个线程分别卖自己的20张票 // private static int tickets = 20;//加了static则是四个线程共同卖20张票 @Override public void run() { while(tickets>0){ System.out.println(this.getName()+"卖了第【"+this.tickets--+"】张火车票"); } } }
综上可以看出,Thread继承类创建的对象不能同步;Runnable继承类创建的Thread对象,对象是共享的,可以实现同步。
参考:
http://mars914.iteye.com/blog/1508429
http://www.cnblogs.com/snowdrop/archive/2010/08/04/1791827.html