Runnable
package xianc.zhuoye;
public class zuoy2 implements Runnable{
/**
*
2. 三个窗口同时卖票 用 实现Runnable方式
*/
static int a=20; //总票数
static Object Obj=new Object();
public static void main(String[] args) {
zuoy2 z1=new zuoy2();
//Runnable只需要创建一个本体类对象
Thread t1=new Thread(z1,"一号窗口");
//创建thread线程
t1.start();
Thread t2=new Thread(z1,"二号窗口");
t2.start();
Thread t3=new Thread(z1,"三号窗口");
t3.start();
}
@Override
public void run() {//Runnable接口的run方法
while (true){//无限循环
try {
Thread.sleep(1000);//所有线程各卖出一张票停留1000毫秒
synchronized (Obj){//打开线程锁
if (a>0){
System.out.println(Thread.currentThread().getName()+"卖出的"+a+"号票"+" "+a); //Thread.currentThread().getName()打印线程名称
a--;
}else {
System.out.println("票已卖完");
System.exit(0);//关闭jvm
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Thread
package xianc.zhuoye;
public class zuoy1 extends Thread{
/**
* 1. 两个线程轮流打印数字,一直到100
*/
static int a=100;
Object O=new Object();
public static void main(String[] args) {
zuoy1 zuoy1=new zuoy1();
Thread t1=new Thread(zuoy1);
t1.start();
zuoy1 zuoy2=new zuoy1();
Thread t2=new Thread(zuoy2);
t2.start();
}
@Override
public void run() {
while (true){
try {
Thread.sleep(1000);
synchronized (O){
if (a>0){
System.out.println(Thread.currentThread().getName()+" "+a);
a--;
}else {
System.out.println("输出完毕");
System.exit(0);
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
两者区别
Runnable 是接口。
Thread 是类,且实现了Runnable接口。
但是在程序开发中只要是多线程肯定永远以实现Runnable接口为主。
实现Runnable接口相比继承Thread类有如下好处:
1、避免继承的局限,一个类可以继承多个接口。
2、适合于资源的共享。