大家好,今天和大家聊一聊Java中的多线程并发编程。这个多线程并发编程想必大家都懂。说白了,就是在代码中开一个新的线程去执行一段代码,然后你可能不知道那段代码什么时候执行的,但过一会总会执行的。代码是如何执行的?那么我们就来看看这种所谓的多线程并发编程的运行原理。其实还得从main方法说起。简单的说,你写了一段Java代码,其实一般来说,要启动并执行这些Java代码,你必须运行一个main方法,对吧?而现在这个SpringBoot比较流行。其实SpringBoot也是基于main方法启动的。运行代码时首先要做什么?其实首先它会启动一个JVM进程,然后JVM会加载你写的类,然后开始运行你的main方法的代码,然后运行你写的其他所有代码。在运行代码的过程中,他需要什么类,只要把那个类从磁盘上的代码文件加载到内存中即可。如下图所示:那么这个时候我问一个问题。想一想,JVM进程是如何运行main方法的呢?JVM进程是直接执行main方法中的代码吗?当然不是,实际上所有的代码运行都依赖于线程。一个进程中可以开很多线程,所以JVM进程会有一个默认的线程,叫做主线程。这个主线程负责运行我们main方法的代码。如下图所示:什么是多线程编程?那么此时所谓的多线程编程是什么意思呢?它甚至更简单。如果你不启用多线程,默认情况下,它是运行你的main方法的主线程和后续的所有代码。这时候如果想开更多的线程同时运行其他代码,可以使用代码newThread().start()直接开一个线程,那个线程会同时并发运行,运行它的部分代码。注意,多个线程是可以并发运行的,也就是说主线程和新开的Thread线程几乎同时运行。如下图所示:那么这个时候问题就来了。对于你的主线程,开一个thread线程来执行部分代码。但是问题是,你想等线程运行完了再给你返回值,但是你不知道线程什么时候运行完,你甚至不知道线程怎么给你它的返回值.换句话说,你的主线程和thread线程之间缺少一些控制方法。如下图所示:基于FutureTask获取线程的返回值那么这种情况下,玩多线程并发编程的时候就必须要引入Future。这个Future实际上代表了你控制另一个线程的权利。当你启动一个线程并运行它时,如果你能得到一个Future,你就可以使用这个Future来控制那个线程。比如中断那个线程thread的运行,比如通过Future获取那个线程的返回值等等。如下图所示:所以这个Future是我们在Java写多线程并发编程的时候一定要掌握的,因为经常用到!下面就来介绍一下这个Future在代码中是如何使用的吧!首先,我们写一个线程子线程的任务代码,如下:out.println("模拟运行任务代码");//默认任务代码总共需要500ms来运行Thread.sleep(500);Stringresult="模拟返回结果";返回结果;}}然后我们写一段代码在main方法中,使用FutureTask开启一个thread线程运行上面的代码,使用Future获取thread线程运行完代码后返回的结果。代码如下:publicclassFutureTaskTest{publicstaticvoidmain(String[]args)throwsInterruptedException,ExecutionException{//根据我们自己写的任务代码构建一个FutureTask。说白了,这个FutureTask其实就是一个任务,只不过是用这个JDK提供的FutureTask来封装我们的任务代码FutureTask
