00:01
各位同学大家好,下面呢,我们就通过这个SN的关键字来实现一个卖票的例子,通过我刚才分析的多线程的编程步骤,上部把这代码我们下面就来写一下。然后各位看一下,首先我这里边呢,就是把我这个项目在里边已经创建出来了,就是一个普通的Java工程,然后创建之后呢,我现在在里边,比如我先建个包,这个包我就叫SYNC啊,就是这个S这么一个包,然后创建之后在这里,我们现在来创建这么一个类,在这里边就实现咱们这个卖票的例子。那这个类我给它起个名字。比如说因为咱们现在是做这个卖票这个相关的操作,那这个类呢,我起个名字啊,我叫这个cell。卖票这个类创建了,然后创建之后,按照我们刚才说这个就是最基本的流程,咱们来写一下,首先第一步各位应该记得啊,我在里边把步骤快速写一下。
01:09
第一步操作,咱们创建一个资源类。然后咱们在资源类里边定义咱们的属性,还有这个操作的方法,这就是我们的第一步操作,那么下面把这步骤我们来写一下,这个类呢,我就直接写到这个cell t中了,因为大家知道一个Java文件中可以有多个类,但只能有一个public类,所有在里边几个类,这个类因为咱是卖票嘛,票就是咱的资源,所以类的名字我就叫这个ticket。这是我们建一个类,然后创建之后,在那里边,首先我们创建一个属性,这个属性就是我们那个票的这个数量。然后咱们写一下,比如来一个private int,这个数量我就叫number,因为咱们要实现三个售票员最终卖出30张票,所以票的数量就是30,这是定义属性,然后定义属性之后,下面呢,咱们定义我们这里边就是操作的方法,操作方法就是咱这个卖票的方法,那我下面给各位来写下。
02:24
我们来一个,比如咱就来一个这个private。然后在里边加上一个方法,我们来一个we方法,就是卖票嘛,所以我们叫这个下现在方法就创建了,但是因为我们现在是一个多线程的这么一个效果,所以咱这里边如果说你不加上锁,或者加上那个S关键字,可能会造成里边出现就是多线程中操作中的问题,所以我们现在在方法上面就加上咱们这个S的这么一个关键字,给它加上一个锁的这么一个机制。那我现在啊,在里边,我们就来加一下。
03:03
S的关键字,然后加上之后,在这里边就来实现它的具体内容啊,那比如说我们做一个模拟效果,卖票过程各位同学应该都知道,比如现在我有30张票,每次卖完之后票的数量是不是减一哦,当票的数量达到零的时候,这票是不是就不能卖啊,只有票大于一的时候,那咱们才能把票卖出去,所以下面我在方法中咱就做一个简单的一个判断,判断我当前是否还有这个票可以卖。也就是啊,我这票的数量如果说大于零,咱是不是能卖票,那我来一个叫number。大于零表示目前里边有票,然后有票的话,比如说咱们做个模拟,我在里边就直接做个输出了,然后输出的时候呢,比如说我先输出这个值,我就把那个当前这个线程名称输出一下,让咱们知道是哪个线程,得到这个票的数量,用这个thread.current thread,然后加上里面这个叫get name,这得到就是当前的建设名称。
04:14
然后得到之后在里边,比如说我做个输出啊,说这个线程,比如他卖出了咱们这个票。然后这个票的数量,咱们来一个这个number减点,因为每次减一嘛,然后减一之后,这里边,比如说我们再加上这么一个就是提示啊,说他现在还剩下。多少张票啊,剩下咱就来,这个叫number。啊,这里边啊,我们做一个最基本的模拟效果,所以现在咱们把这个资源类,包括里边的相关的逻辑我们就完成了,就是这么一个基本结构。在这个结构我们可以再看一下啊,这个过程咱刚才是怎么写的,首先各位看啊,我在里边先创建了一个类,这个类的名字我叫赛T,然后里边定义了一个资源类,T里边先定义属性,就是咱们票的数量,然后又定了一个操作的方法,就是卖票,在卖票里边咱们做了一个判断。
05:20
当我票的数量大于零,表示当前有票,如果有票的话,那我们就进行卖票,卖票之后让他的票的数量减一,这里边做了一个基本的模拟,所以现在这个资源类,包括这个资源的方法我们就要完成了,然后完成之后呢,我们进入到第二步操作,第二步呢,咱们在这个就是sell ticket中,比如说我先建一个方法。咱先来一个问方法,然后在问方法中我们来实现里边的第二步,咱就可以创建多个线程,然后让多个线程都去调用我们资源类里的那个操作的方法,也就是咱们现在要实现三个售票员是卖出30张票,所以下面呢,咱就可以创建三个线程,通过三个线程都去调用刚才这个卖票的方法,那下面我来写一下啊。
06:20
首先第一部分,因为咱要调那个资源内存的方法,所以咱先把那个TK这个对象先做个创建。为了一会儿我们调用方便,那我来写一下啊,T等于new上一个T,然后这个选完之后,下面呢,咱就开始创建,就是三个线程的。然后这个线程怎么创建,咱们也是回顾一下啊,大家看一下我的课点中,也就是这个点创建线程,各位应该知道它一共应该是有四种方式,第一种方式继承,一个叫thad内,第二种方式实现run label接口,这两种方式应该都是各位在基础阶段学过的,另外还有两种方式,一个叫Co a接口,一个叫线声值的方式。
07:12
这两种方式咱们后面的内容中会讲到,所以咱们现在先用里边的这个方式做到,但是这两种方式呢,我们实际中一般用哪一种方式呢?给大家说明啊,就咱一般啊很少用这种继承方式,因为各位同学应该知道Java是单继承,它的继承是很珍贵的,所以咱一般很少用,但是能实现咱用这个reableable接口方式做到,那怎么做,咱们看一下这个API文档中。首先咱找个包,就这个Java long包,然后在Java long包里边呢,有个类,就是这个类叫threat这个线程类。然后在线程类中,咱们找到它那个构造方法,大家看里边啊,就是咱就看这个。
08:01
这是不是构造方法,然后你看构造方法中两个参数,第一个参数是不是传这个run内接口,第二个传的其实是你那个现成的名称,所以咱们很多时候都习惯用这种方式做到,当然用别的方式肯定也可以实现,那下面我把这个代码给各位来写一下,咱就来创建一个线程,那我来做一下啊,首先我new上一个thread这么一个类。然后在里边两个参数,第一个是那个reable接口,而reable接口你可以怎么做呢?多种写法,第一种写法你可以再写个类,然后实现接口,然后第二种方式,我们可以写一个匿名内部类的方式,那我们就这么来做了,我直接就new上一个re内接口,然后在run内接口中是不是一个run方法,Run方法中写上你那个执行逻辑,这就是。第一问参数,然后写完之后第二份参数呢,加上咱那个现成的名称,这个名称比如我就叫AA。
09:06
然后写完之后,这线程最终是不是要运行或者说创建呀,所以咱们第二个方法叫这个start,最终把它创建,这样的话这过程就完成了,完成之后咱们在run方法中去调用那个卖票的那个方法,或者说调用资源类中的操作方法。那我们来调一下啊,因为现在一共有30张票嘛,所以我就多循环几次,让他能看到效果,就是咱们I等于零,I小于这个。40吧,等于大于30,最终在里边掉方法,T点上这个cell方法,就是里边这个卖票的方法,比如咱们刚才写到这个方法,然后把它我们做这么一个,就是最终这个调用啊,那我们来调一下这个方法,然后最终把它做一个实现。
10:00
啊,咱们给他就是完成一下啊呃,然后这个方法就给它改成这个public啊。还有然后这里边我们最终调一下这个这个方法,所以现在把这个线程部分就完成了,这就是我们的第一个线程,然后创建之后,咱用同样的方式再创建第二个,包括第三个线程,那我来直接复制一下啊,这是第一个线程。然后咱们再创建第二个线程,再创建第三个线程,我把这个线程名称改一下,第一个叫A,第二个咱就叫BB,第三个我们就叫这个CC。所以大家看目前这个最基础代码咱们就完成了,按照咱说那个多线程的变成步骤,这是第一步资源类和方法,第二步多个线程我们进行调用,然后多个线程创建,我们用这个threat加reable接口方式,最终把这个咱们就完成了,所以各位应该能把这代码快速给他能够写出来。
11:06
好,代码完成之后呢,下面呢,咱们来做一个最终的测试,那我现在把它来执行一下,咱们看一下最终的效果是怎么样,然后大家看目前执行了,我们看啊,就是目前我这次执行效就是。AA的售票员是不是卖出的所有的票,就是他把这些应该都卖出去了,那我这里边比如说我执行多次,他每次效果应该是不一样的啊,就是可能是A,可能BB,也可能CC,包括你看这次。BB售票员是卖出了前几张,后面是不是由A去卖出去的,所以现在我们就模拟出了这么一个效果,由三个售票员最终卖出30张票,咱用这个叫sight的这么一个关键字,把这过程我们最终做了实现,所以咱们现在啊,就把这个知识点做了复习。
12:00
通过这个复习,大家既要掌握的关键字的使用,另外还要掌握咱们这个多线程的编程步骤,所以这个例子我们就完成了。
我来说两句