Thread和Runnable其实并没有本质区别。
一个是通过继承Thread类,重写run()方法,只允许单继承。
另一个是实现Runnable类接口的run()方法,再结合Thread类来实现多线程。
用Runnable来实现火车站卖票
public class Demo1 implements Runnable{
static int i=20;//总票数
static Object ob=new Object();//静态类
@Override
public void run() {
//循环卖票
while (true) {
try {
//模拟卖票
Thread.sleep(2000);
//同步锁
synchronized (ob) {
if (i > 0) {
System.out.println("还剩:"+i+"张票");
i--;
} else {
System.out.println("卖完了");
System.exit(0);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
//三个窗口同时卖票
Demo1 demo = new Demo1();
Thread thread = new Thread(demo);
thread.start();
Demo1 demo1 = new Demo1();
Thread thread1 = new Thread(demo1);
thread1.start();
Demo1 demo2 = new Demo1();
Thread thread2 = new Thread(demo2);
thread2.start();
}
}
用Thread来实现火车站卖票
public class Demo4 extends Thread{
static int count=20;//总票数
static Object object=new Object();//静态变量
@Override
public void run() {
while (true) {
try {
//每两秒钟售卖两张
Thread.sleep(2000);
synchronized (object) {
if (count > 0) {
System.out.println("第" + count + "张");
count--;
} else {
System.out.println("卖完了");
System.exit(0);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
//两个窗口
Demo4 demo1= new Demo4();
demo1.start();
Demo4 demo2 = new Demo4();
demo2.start();
}
}