1、利用继承Thread类的方法实现模拟售票系统:
public class MyThread extends Thread{ //继承自Thread类 private int tickets=10; public void run() {//重写run方法 while(true){ if(tickets>0) System.out.println(getName()+"售票窗口,售卖了"+tickets--+"号票");
else
System.exit(0);
}
}
}
public class Test { public static void main(String[] args) { MyThread window1 = new MyThread(); MyThread window2 = new MyThread(); MyThread window3 = new MyThread(); window1.start(); window2.start(); window3.start(); } }
由运行结果可以看出,一张票在每一个窗口买了一次,在三个窗口卖了三次。因为在测试类中创建了三个线程对象,每个对象有各自的属性,他们处理的数据是相互独立的。因此,用这种方法处理售票系统是不成立的。
2、实现Runnable接口,模拟售票系统:
package pers.zhb.runnable; public class MyThread implements Runnable { private int tickets = 10; public void run() { while (true) { if (tickets > 0) System.out.println(Thread.currentThread().getName() + "售票窗口,售卖了" + tickets-- + "号票");
else
System.exit(0);
}
}
}
package pers.zhb.runnable; public class RunnableDemo { public static void main(String[] args) throws InterruptedException { MyThread mt=new MyThread(); Thread thread1 = new Thread(mt); Thread thread2 = new Thread(mt); thread1.start(); thread2.start(); } }
此方法虽然建立了三个线程,但是他们是来自同一个对象的,即每一个线程调用的是同一个run方法,有相同的数据。
因此:Runnable接口适合多线程访问同一资源的情况;并且避免了java语言单继承带来的麻烦。