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