00:00
今天我们要分享的是三面试题,解析three的start方法与run方法,那这三个面试题是这样的,第一个是start和run的区别。第二个是两次执行start会发生什么?第三个是一个特殊线程的执行。然后我们来看一下。首先我们来看这么一段代码,这个代码的话就是去输出了一下main方法执行的线程,并且创建了一个线程,传入了一个run的实例,这个是一个拉姆达表达式的一个写法,大家可以去学习一下别的课程去了解一下,然后我们分别用run和start去运行一下这个代码。那我们来执行一次。我们可以看到当执行run方法的时候,它其实打印的是命的run a实例,这说明我们的run方法执行其实跟命方法的执行使用的是同一个线程来执行的。那我们看一下,我们把这个read的start解开,然后我们执行一次,在看一下有什么区别,然后我们可以看到这个start的方法,它调用的是three的零这个线程去执行的,也就是说只有的方法它会真实的去创建一个线程去执行对应的方法,调用装方法其实相当于在命运方法中调用了其他的一个方法去执行的含义是一样的。那我们来看一下它相关的一个源码,首先我们来了解一下run方法,我们可以看有一个allread的标识。
01:35
它其实是实现了一个接口,然后写重重写了里头的run方法。给的类有实现run接口,Run方法其实就是是呃重写的呃run中的run方法,它这个方法其实很简单,就是判断了一个target是不是空,它不是空的话去运行target run方法,反之就什么都不做。而这个target的话,其实本身是一个run的实例,这个实例其实就是通过我们的构造函数这里传过来的。
02:07
然后它还有各种不同方法前面的构造函数,但是里面都有一个run。这个最后就会复制给我们的place中的这个target这句话,然后我们再来了解一下start方法。Start方法的话,它的这个代码就比较多一点点,然后但是也很简单,第一个的话是去判断一下线程的状态,如果说线程状态不是零,这个零代表的是新建状态,如果不是零的话,会抛出一个异常,那我们在上一次的分享中有讲过线程状态的一个扭转。一个线程在调用star的方法之后,就会进入到runable状态,并且从new到run状态,这个呃过程是不可逆的。那我们就可以知道,其实当我们调用的方法的时候。
03:04
再次调用它,这个判断应该就是会成立,并且抛出异常,那我们一会可以试一下调用两次到的方法是不是这样的。然后我们把这个代码改造一下,改造成调用两次start的方法,然后运行一下,看看我们是不是我们预料到的。是的,他在这里抛出了一个异常。那第一个问题和第二个问题我们都有讲解了,让方法和star的方法的区别,然后调用两次二的是会抛出异常,那我们看一个另一个问题,我们就把这一个类改造一下,让它继承我们的thread,并且我们在里面重写一下我们的run方法。然后我们在这里就直接输出。
04:18
就是thread。然后我们把这边new的这个thad改成我们自己的thad method这个TH,然后这里需要去把构造函数添加一下,不然的话它就只有一个默认的构造函数。
05:03
然后我们调用一下负类的。构造函数。这里也是。代码就改造完成了。然后我们分别嗯,去执行三次。第一次的话,就是我们普通的一个方方式。我们自己清见一下。就是直接去新建这么一个县城。然后我们去执行。然后在这里的时候,我们去调用一个现成的就应方法,现成的这个就应方法的话,呃。它其实起到的一个作用是把这个呃,主线程给。
06:02
陷入等待状态,等待这个所谓的一执行完成。然后我们在这里输出。然后我们以此类推,我们把后面的改一下。嗯,然后我们再写一个。简单一点的是使用的方式。岁月的二。然后这个的话就是一个普通的thread里面传入了一个round。那我们来运行一下。
07:00
第一个和第二个结果比较好猜测,第一个的话肯定是输出了extend three的,呃,第二个的话应该是输出了这个run实例,那第三个我们应该会输出什么呢?我们看一下。大家可以想一下,基于我们刚才源码的分析中分析的run方法和start方法,我们来想一下。那我们来看一下,跟我们分析的是一致的,第一个的话它是打出的three,第二个的话是打出的role实例,那第三个我们看到和第一个打印的一样,是的,那第三个我们其实是把这个run实例给传进来的,它为什么没被。执行呢,重新回到我们的run方法,这个的话其实相当于是。我们把three的run方法给重写掉了,重写掉的是说出这么一句话,那其实相当于就是把它原本的。判断target是否为空的那个逻辑给覆盖掉了,我们再找到原来的那个逻辑。
08:08
嗯,相当于我们把这这套代码给覆盖掉了,替换成了我们的那个输出语句,嗯,所以说它不会去,呃,调用run able的run方法去执行,这个其实就是run的run方法的逻辑,对,那这三个面试题其实我们都解释清楚了,希望本次的分享能让你对。呃,类的star方法跟run run方法有两很好的一个理解,好,本次分享就到这里,喜欢的话希望你能关注点赞一下,谢谢。
我来说两句