00:00
嗯,好,嗯,这个刚才大家练的时候呢,有个同学出了这样的一个问题啊,可能有的其他同学也会出现过,那我把这个问题呢稍微说一下啊,就是在去执行这个程序的时候呢,报了一个这样的一个error,说呢叫无效的原发行版1.9啊就是大家呢,可能也有同学会出现这样问题,包括其他的一些特殊的一些异常情况,也并不是说所有的你出现的问题呢,我都见过啊,当然这个我见过啊,啊就是当大家呢,遇到一些莫名的问题的时候啊,这时候呢,你不能什么,当然你第一反应想到我,这我感到很荣幸是吧?啊当然你到开发的时候呢,你不能第一时间老想我了啊,这个你得想谁啊,想百度呗,是吧?啊,就是基本上大家现在遇到的各种各样的问题,你去百度呢,通常都会找到答案,但是这个时候呢,嗯,你你怎么去搜,这也是一个技巧啊,就是你比如说你像搜这个问题,你最好前面先写个idea空格一下,说无效的原发行版啊,1.9写或不写都行,因为你要写前面要有个冒号,冒号呢中英文有时候又不一。
01:00
样,所以你就光写个无效的原发行版就可以啊,就是大家呢,在工作的时候呢,你会出现各种各样的问题,包括呢,各种各样新的一些框架,新的一些工具啊,你可能都没有用过这个,你不能指望说呃下套视频,买一套视频看一看,学一学,那下视频的那个人他不也是学的嘛,是吧?啊那你有可能你是以后要录视频的那个人的,所以你不能指望着老师去下视频了啊,那书的话呢,那个一般书出来的比较慢,也不会说把所有的一些呃这个错误信息都给你列的很全,那都成一本字典完成了,呃当然呢,大家可以去呃用百度是吧,去搜索百度也好,谷歌也好,总之的话呢,就是呃会善于去使用这个搜索引擎,找到你这个问题的解决答案,这绝对是一种能力。啊,而且这种能力这个是值得大家去训练的啊,不是说呢,今天我不会用,明天的话呢,好老师说用百度,那我就以后用百度说这个能力就有了,还不是啊,你会发现呢,真实当中有的同学呢,大家都遇到这个问题了,有的人家呢就解决了啊百度出来的啊,你呢,有的就解决不了,那说明你还是百度的不到位是吧?啊就是基本上大家现在遇到各种各样问题都是可以解决的啊,就跟有些人说现在呃,一出去说我要创业是吧,我有个特别好的一个idea啊,你放心,基本上你的这个idea。
02:11
已经有很多人也都想到过啊,你现在很难说遇到一个点子说别人都没有想到过的,这个基本上可能性不大啊,但为什么你出来这idea以后呢?呃,别人可能也想过没整成呢,那有很多种原因呢,是吧,有的可能这个事儿呢,根本就不靠谱啊,也有可能这个事儿可能挺靠谱,但是你这个团队不靠谱,或者说你本身就不靠谱是吧?哎,都有可能导致的话,你这个事儿做不成啊,像昨天呢,大家分这个分享马云,那人家就整成了,嗯,只是可能看着大家说马云是个骗子,不靠谱,但是呢,他这个事儿做成了,那就靠谱是吧?嗯,那只能是通过事情来验证啊,这个这个人怎么样啊?嗯,所以说呢,就是呃别天天马行空是吧,就是呃更务实一些啊,更务实一些,包括以前有一些这个这个同学说这个他们这个导师啊,说一个导师不靠谱,什么叫不靠谱呢,导师呢,就是他自己不去,呃,这个这个动手写这个代码啊,他天天就是靠想是吧,啊想到什么点子让这个学生去做啊,这个老师的话呢。
03:12
也不爱去看一些论文,那这个老师肯定是没有前途的啊,啊你论文你都不看的话,你都不知道现在主要研究到什么方向,什么新的进展,光自己去想,你想的那些东西,放心一定别人都想过啊,那想过的没有看到这个论文没有写出来,说明那个不靠谱啊,你想到了人家都写出来了,那人家早发表了,也轮不着你了,是吧?所以你不去呃实操,然后光去想这也没有意义了啊行,这个问题怎么解决啊,拉回来怎么解决呢?主要原因是这个啊,这个1.9呢,主要是针对是GDK1.9这个版本,就相当于你在这个1.9上去跑了,但是呢,咱们目前你看我们这有个叫呃,External libraries,这个你点一下,咱们目前呢,在当前的这个工程下,用的是1.8,相当于呢,你装的是1.8的这个JDK啊,那对应的你这个GRE呢,也是1.8的,但是你试图呢,让他用1.9去跑,那你这个1.9是从哪看到的呢?呃,在咱们这个,呃,Settinging这个旁边呢,有一个叫啊product structure就是整个这个项目的一个结构啊。
04:12
点开点开以后,嗯,咱们当前呢,没有建这个module啊,咱们相当于把这个代码呢,还都写到这个工程下了啊,这回头咱们把它呢也可以移到这个modu下啊,然后呢,这个project这块我们能够看到,哎在这呢有个IK default,哎你这呢八成是写成的是这个九啊,因为你这选的是这个九,你看我这块呢,我要试图执行一下,就会出现刚才这样的一个问题。啊就这个啊,你装了1.8的这个JDK,你用你你需要让他在1.9的这个环境下去跑它可不就错了,哎,所以这块呢,你得选上这个八,或者你选上这个SDK默认的,因为咱装的是八啊,默认的也是八啊这呢就OK,再跑一下就没问题啊,这就就又可以啊就可以成了啊啊这个呢,因为以前呢,我也出现过这个问题啊啊所以说当你百度完以后呢,你就记住了,下次别人一问的话呢,瞬间就告诉他,这时候他觉得你好好厉害是吧?哎,大家以后呢,你也是啊,就是多去积累这样一些解决方案啊就可以,嗯,另外的话呢,我这个这个注式设置成这个颜色,好像大家看起来是有点费劲哈,这个改一改了哈拉尔这个。
05:20
嗯,这是这个叫这是啥多行的是吧,改一下啊,改成要不就用绿的吧。行,嗯,我还得记一下这个数啊,CTRLC。这是这个文档的。单行的CTRLV,这个大家知道不?这个数这个数呢,后边咱们讲这个web的时候呢,呃,涉及到页面了,会给大家去说哈,这里边儿你看这个是两个一对哈,洋一对对,这个呢叫RGB3颜色。啊,三颜色2RED啊,G greenb blue啊,就是我们这个实际上有这个三颜色,你看这能看这不是绿的吗?这是蓝的,是这个红的啊这三种颜色呢,就可以构成我们世间万事万物的这种丰富多彩的颜色了啊然后呢,这个就是RGB,每个呢占两位啊就可以了,诶出示一下啊OK啊还是这个呢,稍微清楚一些啊行,那咱们接着往下讲,那讲下一个啊叫呃,实现reno接口这种方式创建多线程之前呢,咱们先来做一个呃例子,通过这个例子呢,咱们引入这个第二种创建多线程的方式啊。
06:37
嗯,咱们在这个Java下把这个都收起来了啊,咱们呢再写一个例子啊,这个例子我们这个呢,就叫做window啊,它的一个test,我们呢,现在再写一个例子,就是创建一个多线程啊嗯,创建要求呢是三个窗口卖票。
07:01
哎,创建三个窗口卖票,然后总票数为100张。张啊行,我们呢就做这样的一个例子,那很显然的话呢,我们造三个窗口去卖票呢,比您这一个窗口呢就要呃效率高一些了啊那我们来做这个问题,这呢是咱们这个呃执行的这个程序了啊咱们先呢,按照第一种创建多线程的方式,首先呢是class,不妨呢,我这个类呢就叫做window了,哎让他呢去extend继承咱们的这个thread类,继承以后咱们重启一下这个run方法,哎这个run方法呢,主要做的事就是卖票。卖票这个咱们前面呢,是便利一下,100以内的偶数或者是奇数,咱们直接在里边写了一个方循环,现在呢,你要卖票,这个票是不是咱们得定义成一个属性了,哎,所以我们在这儿呢,去声明一下啊,哎,这个你生明成个private也可以,哎这个我是个int型的,就叫ticket票啊,这个我就显示为这个张数了啊,一共是100张,然后呢,诶,我们回头呢,造三个这个window的对象啊,让他们每一个对象呢去start,然后就一块儿呢,都各自执行这个run方法,然后去卖票,哎卖票呢这里边嗯。
08:23
你就没办法指定说某一个窗口,这个窗口卖30张,那个卖40张啊,那个卖多少张,你不能这样指定了啊,那有可能是这个卖的多点,那个少点啊,所以这里边呢,呃,咱们写循环呢,就不去指定说具体每一个线程执行多少次了,所以我这呢,就先成一个形成一个外务处,好真的就开始进入去循环的去卖票,卖票的话呢,我们得做一个判断啊,说如果这个7K呢,是大于零的啊,就说明呢还有余票。哎,我们在这里边呢,就做一个输出了,嗯,这个叫s out啊说这个,嗯,咱们也提供一下这个先程名吧,先程名这个你要写完整的话呢,就是red.current red点去get它name,嗯,那实际上呢,前面这块呢,也可以省略掉啊,因为本身呢,就在这个线程的这个此类里边啊,本身呢,它就已经是一个县城了,Get name,然后呢,哎,我们说它呢,嗯,来一个冒号吧,呃,这个比如回头我们这个名字就起名叫窗口一啊,窗口一卖票。
09:29
哎,那个票号为,哎这个呢,不妨咱们把这个TK的呢,本身就当成是一个票号了,那就相当于从这个大号开始往这个小号这块去卖啊,然后卖完一个票号以后,对接着呢,我们这个TK呢,做一个减减操作。嗯,然后呢,如果发现你这个TK是零了,哎,我们这块呢,就做一个break操作,哎,跳出我们当前这个循环结构哎就可以了。这个逻辑比较清晰对吧,嗯,然后这个完了以后呢,咱们回到这个测试的这个类里边写一个main方法。
10:03
嗯,写个没方法,然后咱们去创建这几个对象window啊,来个W1啊,写个T也行啊,哎,New一个window,哎,然后呢,这个我们需要造好几个对象,三个窗口,嗯,然后在他们这个启动之前呢,咱们先给人家起个名字啊,在内这个呢叫窗口一。哎,然后呢,窗口二窗口三。行,接下来咱们分别呢,去调用他们的star的方法。诶CTRL啊,这个就用不着CTRLS了啊,就养成这个习惯了,在咱们这里边儿呢,就不用每次去保存了,自动的就保存了,嗯,这个程序呢,我们就写完了,嗯写完以后呢,有可能还会有一些小的问题,咱们先跑一下啊,嗯,我们执行。
11:02
诶,这就出来了,出来以后这时候呢,我们看一看咱们这个卖票的一个情况啊,哎,这里边有些交互没问题了,但是我们看看的时候呢,发现就有一些事了是吧。有什么事啊,你看这个100吧,这个100的话呢,213,哎,都有100,你去看这个99,这也99,这也99,窗口三呢啊是吧,也有99,呃,再往下走,你发现也有,就是成了啥呢?每个窗口卖100张票了啊,这是巧合吗?不是巧合了啊,那就回过来看这个代码可能有问题,那这个代码问题怎么去解释啊。原因归结为谁啊,诶对这呢,咱们就想解释这些问题,咱们就不用说啊,这是规定,这就没有什么规定指出了,咱们前面已经讲过面向对象了啊,凡是出现一些问题呢,不满足咱们实际开发的需求,有没有报错,这时候你就得去解释,这个解释的话呢,就依据于咱们讲的面向对象的这些逻辑啊,我们在window类当中提供了一个属性,这个属性呢是一个实例变量。
12:20
然后我们下边呢,造了三个对象,那不就意味着每个对象是不是有一份啊啊,那其实你这时候呢,就是三个对象,那就意味着每个人有100就是300张了,然后你这时候呢,调转方法的时候,是不是每个线程,每个线程去判断自己这个呃类的啊,这个对象里边的这个TK的,看看是不是大于零了,嗯,你这个线程一,你把你自己这个TK减减了,人家这个线程二跟三还是100是吧,所以导致我们最后呢,这个卖了300张票,显然不对,那怎么改。有同学说放里边放里边诶好这一下,你看我们在这个idea当中还挺智能的啊,我往下放的话呢,它它不让我往里放,原因是什么呢?我把这个去了,你再往下放啊也不行是吧?啊也不行啊,那咱们就这样吧,CTRLX是吧?放这就能解决吗?放这你就把它删了是吧?这能解决吗?有能让人往放,往循环里放,越往里放这是越是得被批评啊,你这是想怎样啊,这还能出来吗?就是你往这放就已经是有点过分了啊,你再往这放,这就这就太说不过去了啊,放这好使啊,这不一回事吗?
13:54
没有任何区别啊,你每个线程进来不是还是100张吗?那我就还放这儿了,诶这个这个我al上也不让我出去啊,我还得CTRLX啊CTRLV一下,这个加上一个private怎么改啊对,加个static呗。
14:15
这个时候呢,我们三个线程,不管你是三个也好,四个也好,你造几个线程,咱们就总共只有100张票,因为大家呢,每个对象共享同一个静态变量,这不就解决这个问题了啊,再执行。你看这个时候呢,你先整体上这样去看一下,应该就是100了是吧,但这时候呢,你发现有一些问题,就是123呢,都有100这个票号,嗯,然后你看还有别的重复的不。没有了啊,没有那就挺凑巧的啊,那这时候呢,这个三个100显然呢,其实也不对啊,这个呢,其实就是咱们后边要讲的解决线程的安全问题,咱们暂时呢,大家先忽略这个事儿,就是你先当没看见是吧?啊那除了这个之外呢,你发现整个呢,其实应该就是解决了是那300张票的问题了。
15:10
啊,这个大家注意一下啊呃,另外呢,有没有同学可能会有这样的一个疑问哈,说为什么这个票号不是这个意思递减呢。有人问这个问题不,比如这个窗口30还98,这个99在这呢是吧?对,就是这个输出的话呢,我们需要显示在页面上,显示到页面的时候呢,它可能没有及时的显示出来,但它呢,其实还是先抢到的这个99啊,然后呢,这个98呢才抢到的啊,只是没有及时的给他显示啊,这个没事儿啊,这儿呢,确实是一个问题,但是这个问题呢,咱们先放一放,咱们呢明天讲这个同步的时候呢,专门就来解决这个重票的问题啊,目前呢,相当于这三张票都是真票啊,就相当于这个春运的时候呢,大家去买票了,好不容易抢到一张票,到这个车上以后,你发现诶已经坐了一个,呃,坐了一个美女,还行是吧,坐了个大叔啊,你说这时候你俩都是真票,那你坐他腿上只能这样了是吧?啊都是真的,所以呢,你不可能说卖这个真正的这个重票了啊,就是他如果要是票是重的,那只能是一点,就肯定有人是假的是吧。
16:19
哎,就是从这个窗口上来角度,不能出现这个呃重的这个真票了啊,这个咱们问题先忽略掉,呃,咱们现在呢,这个例子呢,就算是写完了啊,只是呢,现在存在啊线程的安全问题,哎现在安全问题咱们这个呢叫待解决,这个咱们后边再说啊那么这个例子呢,咱们看到这个T,咱们必须呢给它声明成是一个静态的,因因为只有这样呢,咱们才能够解决,大家呢去共用这个,呃这个数据的时候呢,只有一份啊,那如果我不想加静态,有没有别的方式去解决呢?啊这呢,咱们就需要引入咱们说的第二种创建多线程的方式。
17:04
啊,咱们把这个例子呢,先停一下。
我来说两句