如上图所示,我们这里模拟一下去车站买票的情形:这里有3个柜台同时售票,总共是1000张票,这三个柜台同时买票,但是只能一个柜台卖同一张票,也就是说1号票卖了之后我们就只能买2号票,2号票卖了之后我们只能买3号票!依次类推!直到卖完这1000张票,然后再从头开始卖票!如下代码演示:
package com.bawei.multithread; //这里模拟售票窗口 public class TicketWindow extends Thread { //柜台名称,表示第几个柜台 private final String name; //定义一个变量,模拟最多有这1000张票,这里之所以要用static关键字,主要是因 //为不想在线程创建对象的时候,每个线程都有一份自己的实例变量,而是想让我们这里所 //有的线程懂共享同一份数据,也就是只让这个变量初始化一次,所以这里设置为静态变量 private static final int MAX=1000; //给定一个初始化变量,从第一张票开始卖,static同上 private static int index =1; public TicketWindow(String name) { this.name = name; } @Override public void run() { while(index <= MAX){ System.out.println("当前柜台是"+name+", 所售号码是"+(index++)); } } }
上面这个类是Thead的子类,模拟售卖票的窗口,这里面控制着唯一资源票,而且这个票是被几个窗口所共享的,所以这里我们定义成了static的!
package com.bawei.multithread; public class Station { public static void main(String[] args) { //这里我们创建了三个线程,来模拟3个柜台! TicketWindow ticketWindow1 = new TicketWindow("1号柜台"); ticketWindow1.start(); TicketWindow ticketWindow2 = new TicketWindow("2号柜台"); ticketWindow2.start(); TicketWindow ticketWindow3 = new TicketWindow("3号柜台"); ticketWindow3.start(); } }
这个类就是车站类,在这个类中我们创建了3个TicketWindow对象,用这三个对象来模拟3个售票窗口同时售票的情形!
注意:这里有一个问题,就是票是static的,是被多个线程对象所共享的,资源是唯一的,但是static修饰变量的生命周期是很长的,因为它不是随着类的消亡而消亡,这个变量一旦被JVM加载到内存中,它是有一个单独的区域来存放这个变量的,它的生命周期比类的生命周期可能还要长!当然这这只是一个粗糙版本的售票系统!我们下面会用代码给大家演示,如何友好的,将线程和业务分离开来的一个方式!
时间: 2024-12-11 13:20:21