假设我们要做一个购票系统。
那么首先,购票系统是由票数,购票,用户组成,并且同时会有多位用户进行购票。所以,先创建一个票装置类Ticket类,这个类只需有一个属性——票数(100张)。然后,就是用户购票的类,这个类则用到线程类——UserThread类,让它extends继承Thread类或implements Runnable接口类。
然后,在UserThread类中·,首先我们要定义一个Ticket类的属性,用来传递Ticket对象(更详细的说,获得票数信息),接着,直接用构造方法实现对象传递,即:
接着,重写run方法,(——因为每个线程只能调用一次start方法,启动线程后run方法自动执行,run方法执行完线程即结束,且一旦结束不可再启动)所以run方法一般只调用一次,因此想让它不断操作,我们只需写一个循环,这次我们用for循环50次即可。再加上延时代码。
然后,由于多个用户同时购票,即多个线程同步进行,我们实现线程同步有两种方式。
在这之前,首先看若不使用同步线程,直接让两个用户购票出现的结果:
我们可以看到,A已经买到16号票,B却也买到了16号。所以要用线程同步。
首先看第一种方式,同步代码块。
synchronized(监视器(对象锁)){
需要同步的代码...
}
这个监视器(对象锁):任何一个对象都可以作为监视器使用。但注意,需要同步的线程使用的线程必须是同一个监视器。打个比方,若有三个人共用一台车,若每个人都有钥匙,则在第一人使用时,其他人也能使用,会造成上述那样的局面。
比如,当我们extends Thread时,代码如下:
由于我们设置的监听器是this,也就是当前UserThread类对象,而因为我们创建了A,B两个对象,导致使用的监听器不是同一个,所以结果错误。
解决方法之一就是implements Runnable接口类,这样就只创建了一次UserThread(创建两个Thread线程),如图:
接下来是第二种方式,同步方法,注意,同步方法不能用extends继承thread来启动线程。
代码如下