00:02
好了,那咱们接下来继续吧,再往下看啊。那么再往下呢?来看一看实现线程的第三种方式。实现线程的第三种方式呢,这种方式啊,就是在我们那个JDK的新的版本当中,它推出的一个特性啊,一个特性以前是没有的啊,以前就两种方式,就我们之前讲的两种方式,但是现在呢,除了那两种方式之外呢,我们还有第三种方式,各位啊,这第三种方式是什么呀?是。接口。啊,是实现接口。嗯。那么这种方式啊,这种方式实现的线程。可以获取什么呀?可以获取现成的返回值。之前讲解的。
01:00
啊,那两种方式是无法获取什么呀,线程返回值的。因为因为run方法返回什么。Run方法访问什么呀,各位,因为run方法返回void。是吧,哎,Run方法返回void啊,就假如说假如说现在我们委派了一个线程去执行一个任务。那这个线程执行完一个任务之后,它这个线程有没有可能我们需要,我们需要得到这个线程执行之后的一个结果呢?就大家思考一个一个一个东西,对吧,你是委派是不是啊一个县城。去什么呢?叫系统嘛,系统委派一个线程去执行一个任务。对吧,该线程怎么着,该线程执行完任务之后。啊,可能会有一个什么,可能会有一个执行结果,我们怎么能拿到这个执行结果呢。
02:05
哎,使用线程使用第三种方式叫做实现什么呀,Cable接口。方式啊,实现接口方式。我们一起来看一下这种方式怎么去实现。嗯,在thread当中啊。这块我们就是14是吧,该15了,新建一个class,我们就TEST1五行吧,新建出来。PSVM。那么这块呢,咱们来看一下啊,就是实现线程的第三种方式。就实现什么呀。啊,实现接口。首先我们需要创建第一步啊,第一步需要创建一个未来任务类对象。
03:04
啊,叫做未来任务。任务类对象啊,叫做future。Future task。Future task啊,然后呢,这个future task它是个未来任务类对象,注意看它的实现步骤,各位啊,它属于guc这个包下的J。UC叫Java并发包,Guc包。包下的啊,属于Java的并发包。并发包啊,老JDK中没有这个包啊,没有这个包新特性啊新特性。The Java concurrent future task。然后呢,这个构造方法里边呢,它需要传一个大家看不是这个roundable啊,是columnable,当然它可以传个able,传roundable的话,呃,传round的话就没有返回值啊,没有返回值我们。
04:08
我们要看的是这个返回值这个事儿啊,Column参数,到时候用这个各位啊,用这个参数啊,需要一个column参数,那column这个东西是什么呢。我们来看啊。呃,Call也是Java u to con这个包下的,我们发现的这个呢,它有个方法叫call方法,大家看这个是不是可以用泛型。是不是能用泛型啊?里边是不是有个方法,不是run方法,叫Co方法,是不是有返回值啊,你看有返回值,你看是不是返回值你看。是不是啊,那么这里呢,我们可以用翻型,也可以不用翻型。那它参数既然需要一个column的话,我问大家这里能不能用匿名内部类。哎,你看参数这个接口啊。可以吗?
05:01
可以吧,哎,我们用一下各位啊,拗一个什么呀,Colorable啊扭了啊走了,好大家看这就直接扭出来了。这个括号方法就相当于是run方法啊,括号方法。就相当于什么呀,Run方法啊,相当于run方法。只不过这个有返回值啊,只不过这个有返回值。对,在这里的线程对吧,线程执行一个任务,执行之后可能会有一个执行结果,假如说我们模拟一下执行啊,模拟执行thread.sleep1睡睡十秒钟。啊,睡十秒。行吧,哎,睡十秒啊,睡十秒,睡十秒,然后开始执行,咱们就在这儿打印一句话就行了,输出叫做call method。Execute。
06:01
行吧,然后呢,在这输出叫call method end。开始执行,执行结束,最后的话,返回一个对象得了行吧,哎,Object就new new一个呗,New一个object啊就简单模拟一下就行了,好吧,啊简单模拟一下,或者说我在这里呢,我我我这样in特I等于in a。等于100IN b呢,等于200RETURN一个什么呀?A加B。A加B自动装箱吗?A加B不是300吗?返回一个对象的话,300肯定会变成T吧。是不是300结果变成什么呀,变成in t吧,啊叫自动装箱啊行,那这个第一步呢,我们就就完了,创建一个未来任务对象,注意参数非常重要啊,参数非常重要。需要什么呀,需要给一个什么呀,给一个call的call接口的实现类,实现类。
07:01
对象需要给一个Co接口的实现类对象啊,你就这么做就行啊,那么接下来呢,我们得在这干啥呀?得去创建什么呀?线程对象怎么创建呢?Thread t等于new一个thread,各位啊,你还是这种new的方式,把上面task作为参数传进去,这样的话这个线程对象就创建完了。那。现成对象就创建完了,各位啊,创建完了。看见了吧,是这样做的啊,是new一个future task把作为参数传进去啊,然后接下来new一个thread,把task作为参数传进去,这样的话,在这个位置上我们启动线程就行了啊,来启动线程,那么启动线程t.start。启动之后有人说老师这个线程执行结束之后,它有一个返回值,那我们返回值我们怎么拿到呢?就是我们怎么拿到这个线程执行结束之后的返回值呢?就是返回这个结果我们怎么能拿到呢?哎,这是问到关键关键点上了啊,注意就是我们在。
08:02
这里是闷方法,这是在主线程中。对吧,在主线程中怎么获取T线程的,就这不T线程吗?怎么获取T线程的返回结果。对吧,这是两个线程给嘛,这是main方法对吧?你这不是T线程吗?t.start不是这个另外一个线程就执行了吗?执行完之后另外一个线程不是有个返回值吗?我现在是在另外一个线程问方法这个主线程里面我想干什么呀?我想拿到。这个线程的一个执行结果怎么获取?T线程的执行结果就在这儿对吧?哎,怎么获取T线程的执行结果?行,我不写了啊,怎么获取啊,非常之简单啊,Task。点。Get这个方法。啊。这就是那个结果。这个位置大家看有一个异常对吧,这个异常的话,我们愿意管管,不愿意管的话,我现在再扔出去,先不管这个异常的事儿啊。
09:09
好,大家看这个程序啊,就拿到这个了,那么大家思考一个问题啊,思考一个问题,这个方法的执行会不会导致主线程阻塞。思考。这个get方法的执行。会不会导致闷方法受阻?就会不会导致闷方法受阻塞,也就是说它出现在当前线程当中,闷方法不是主线程吗?主线程不是当前线程吗?对吧,这个代码的执行会不会让当前线程阻塞呢?就是什么叫当前线程阻塞么?方法停了。停了。这个代码是在我们当前的主线当中。
10:00
看见没?对吧,你要获取这个结果吧,我问大家获取这个结果是不是必须等这个方法执行结束。你方法不执行结束你怎么返回值。你在这拿你这个返回值啊。所以说你这个代码的执行是不是一定会等待这个call方法的执行结束,并且真正的返回值这个地方是不是才能get到数据。所以第37行会停下来。导致闷方法受阻,各位啊,也就闷方法,你看闷方法这里的程序要想执行必须等待什么呀,Get方法的结束。而get方法可能需要很长时间注意啊,而get方法可能需要很久。啊,因为get方法是为了拿什么,拿另一个现成的什么。
11:02
执行结果,另一个线程执行。是需要什么时间的?明白吧,另一个线程的执行是需要时间的。你一睡睡十秒啊。对吧。对,就是这样。那么在这里呢,我们输出一个hello word,你看那个hello word能不能输出。他输出不了阻塞了。为什么?因为这个一直在get get get get get get get get等等啥呢?等这个线程执行结束了,他这返回值了,这终于get到了。拿到这个结果了,哎,我们在这儿怎么着啊,继续才能往下走,所以这个钙的方法呀,它可能会它会导致当前线程阻塞。注意啊,Get方法的执行。
12:00
会导致当前县城阻塞。阻塞啊,当前线程阻塞,各位来我们看这个结果啊,线程执行结果。叫做OBJ我们执行一下啊,这看来一。好,大家看靠方法是不是开始执行,睡十秒之后是不是靠方法结束啊。对没啥帮助啊,括号方法结束,你看括号方法结束,整个这个线程返回一个300之后呢,线程执行结果是300,然后这个hello word是不是才会输出。对吧,哎,大家要知道这种方式啊,这种方式有缺点的,有缺点的效率比较低。效率比较低啊各位我先提醒一下,因为这个地方的执行会导致什么呀,我们当前线程阻塞。没有办法往下继续执行,它用来获取什么呀?哎,我们这个线程,我们来获取我们这个这个这个叫做。
13:04
这个线程的一个返回值,但是它有一个优点,各位它的优点是什么?它真的可以拿到你这个线程的一个执行结果。原先的那种方式我们拿不到。原先那种方式,它的返回值类型是Y的,没有反回值。对吧,并且大家看这个方法上面是不是可以抛异常了。对吧,和那个run方法还是不一样的,还是不一样的啊,但是呢,性质上差不多,只不过呢,一个是有返回值,一个呢是没有返回值,你想获取到这个线程的那个返回结果的话,那你就使用这种方式叫Co接口,这就是我们实现线程的第三种方式,实现Co接口这种方式的优点,这种方式的优点是可以获取到返回,可以获取到线程的执行结果。这种方式的缺点是效率比较低。
14:00
当前线程就在获取。T线程执行结果的时候,当前线程受阻塞。啊,效率较低。站之间是独立的,这样会冲突吗?不冲突。他还是两个站。还是那两个站啊,还是两个站,只不过Java虚拟机调度的。啊,加上虚拟机调度的。啊,加油信息调度的啊,这个不用管,这个这个不用管啊。好了,这种方式呢,就给大家演示到这儿吧,行吧,啊,演示到这儿啊。有点像那个招引是吧,有点像啊,但比招引厉害啊,他能返回结果。我这儿呢,采用的是个匿名内部类的方式啊,你可以不采用匿名,匿名内部类,你下来之后写的时候可以采用别的方式,对吧。
我来说两句