当前位置: 首页 > 科技观察

BAT等互联网公司爱问的Java多线程并发面试题汇总

时间:2023-03-13 02:57:35 科技观察

大家好,今天和大家聊聊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来封装我们的任务代码FutureTaskfutureTask=newFutureTask(newTask());//构建线程池,线程池中会有一个真正运行线程的ExecutorServicethreadPool=Executors.newFixedThreadPool(1);//提交FutureTask任务到线程池,让线程池中的线程运行我们的任务代码threadPool.submit(futureTask);//我们可以模拟在这个地方做其他事情过了一会儿,Thread.sleep(1000);//一段时间后,线程池中的线程应该运行完我们提交的任务代码//此时,我们可以通过FutureTask获取任务代码运行后的结果System.out.println(futureTask.get());}}小结通过上面的代码可以看出,当我们使用子线程运行一段任务代码时,任务代码运行后是可以返回一个值的。那么我们只需要使用FutureTask来封装这段任务代码,经过一段时间后,我们就可以通过FutureTask获取到任务代码运行后的返回值。这是我们Java多线程并发编程中常用的一种编程技巧。我希望每个人都能在今天得到这个Future的精彩使用。