一般来说,打开线程可以改善程序的并发性,并且无法在线程类中获得线程执行结果。接头,我们将分析如何逐步获得线程的执行结果。, 你会明白的:
1.获取原始方法的线程执行结果2. FutureTask获得线程执行结果3.线程池获取线程执行结果
打印结果如下:
它表明主线程已获得线程的执行结果1。原理也非常简单:
线程。JOIN原理,请移动:Java thread.sleep/thread.join/thread.yield/object.wait/condition.await详细说明
尽管上述方法可以获得线程执行结果,但存在缺点:
1.每次您需要定义不同类型的成员变量以接收返回结果2。线程。加入阻塞并每次等待。
您是否考虑封装上述功能?是时候到达可召唤了。
最终印刷如下:
可以看出,可以正确获得线程的执行结果。
操作步骤分为四个步骤:
1.定义可可。线程的特定工作在此处处理并可以返回任何值。2。定义FutureTask,保留可呼叫的参考,并指定特定类型的通用类型。此类型确定线程的最终返回类型。最终构建了线程并传递到FutureTask,FutureTask实现了运行。4。通过FutureTask获取线程执行结果。
首先查看关键类别的定义:
可呼叫只有一种方法,该方法返回通用类型。
看未来箱:
以上逻辑很明显:
1. FutureTask实现运行,重写Run()方法。执行线程后,将执行Run()方法,然后运行()最终呼叫呼叫()呼叫()方法,并且返回值记录在成员变量con.2中。执行运行()时,这意味着结果已经出来,并且将通知其他线程(觉醒)。
由于存在觉醒的过程,因此必须有一个等待过程,否则唤醒的逻辑是毫无意义的。FutureTask实现了未来的接口和重写方法和其他方法。
从上面可以看出:
1. futureTask.get()块等待线程执行结果返回2。如果没有结果,请首先将自己添加到等待的链接列表中,您可以指定等待一定时间。如果时间到了,则没有结果,直接返回3。最后,在执行结果之后,强烈转向所需的类型,在示例中,转向字符串。
整个过程如下:如下:
与原始方法和FutureTask方法之间的相似性和差异相比:不同的原始方法实现了通过object/object..notify的等待通知。
同一线程的执行结果存储在成员变量中。
小演示:
线程池提供了三种获得线程执行结果的方法。尽管使用方法不是相同的,但内部依靠可kerable+FutureTask来实现。传递参数被调用,callable.run()确定返回值。
第二个未来> 提交(可运行任务);传递参数是可运行的,runnable.run()不会返回值,因此此时back.get()返回null。
未来的第三个提交(可运行任务,t reccription);除了运行外,还有结果,尽管runnable.run()没有返回值,但是事件将返回结果。
上述三种获得线程结果的分析(实际上是两种类型,最后两种可以归因于一个类别)。尽管实践是不同的,但它们是相同的。如果要获得线程执行结果,则与这两个内核无关:
1.您可以知道线程何时超过2。可以投掷结果(例如存储在成员变量中)。
下一部分将重点放在线程池的使用和原理上。
如果演示代码有帮助,请给Github赞美?
如果您喜欢,请喜欢并注意。您的鼓励是我前进的动力。
作者:小美人鱼爱节目
