/*
四个窗口同时卖票
因为是同时,所以使用多线程
创建4个线程,都是卖票
因为都是卖票,说明四个线程的任务是一样的
只需要定义一个类继承Thread
*/
// 以下是用第一种创建线程的方法(具体方法在我的上一篇博客中有介绍),但是并不符合要求// 线程和线程任务是绑定在一起的
/*class Ticket extends Thread{
// 把num设置成静态的实现各个线程共享同一个num// 但是万一情况复杂,不可能把所有的成员变量都设置成静态的// 所以,这种创建线程的方法用在这里并不合适privatestatic int num = 50;
publicvoid run(){
//死循环,会一直进行下去while(true){
if(num>0){
System.out.println(Thread.currentThread().getName()+"...sale..."+num--);
}
}
}
}
class test{
publicstaticvoid main(String[] args){
// 当num等其他成员变量不是静态的时候,每一个线程初始的情况都是一样的,并不符合实际要求// 但是又不能把所有的成员变量都定义成静态的,所以就有了第二种创建线程的方式
Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
Ticket t3 = new Ticket();
Ticket t4 = new Ticket();
t1.start();
t2.start();
t3.start();
t4.start();
}
}
*/
/*
为了解决四个线程共享票的问题,使用静态方法肯定是不行的
需要使用创建线程的第二种方式:
1、创建实现了Runnable接口的子类
2、重写Runnable接口中的run方法
3、创建实现了Runnable接口的子类的对象
4、创建Thread类的对象,也就是在创建线程
5、把实现了Runnable接口的子类对象作为参数传递给Thread类的构造方法
把线程任务进行了描述,也就是面向对象
线程任务和线程对象的分离,线程执行什么任务不再重要,只要是实现了Runnable接口的子类对象
都可以作为参数传递给Thread的构造方法
实现接口的同时,也可以继承父类
*/
//下面用第二种方法创建线程,解决上述问题//1、创建实现了Runnable接口的子类,这是一个描述线程任务的类class Ticket implements Runnable{
public int num = 50;
//2、重写Runnable接口中的run方法publicvoid run(){
while(true){
if(num>0){
System.out.println(Thread.currentThread().getName()+"...sale..."+num--);
}
}
}
}
class test{
//3、创建实现了Runnable接口的子类的对象publicstaticvoid main(String[] args){
Ticket t = new Ticket();
//4、创建Thread类的对象,也就是在创建线程//5、把实现了Runnable接口的子类对象作为参数传递给Thread类的构造方法
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
/*
为什么创建线程的第二种方式可以解决卖票问题?
第一种创建线程的方式:线程和线程任务是绑定在一起的,创建4个线程就创建了4份资源
第二种创建线程的方式:线程和线程任务进行了分离,只需要创建一个任务,让4个线程分别去执行
*///Thread类也实现了Runnable接口,所以也可以这么写/*class Test extends Thread{
}*///但是不推荐上面的写法classTestimplementsRunnable{
}
classtest{publicstaticvoid main(String[] args){
Test test = new Test();
Thread t1 = new Thread(test);
}
}