幻化成蝶|全要靠线程带,Java程序跑的快

作为Java程序员 , 在技术面试时 , 多线程的知识多少都会被提及 , 这也是我面试候选人时 , 常聊的一个话题 。
纳尼 , 面试中为什么常会问多线程的知识?难道面试官真的是在为难你吗?
莫急 , 下面一起get其中之奥秘 。
使用场景:引入多线程 , 明确职责 , 效率明显提升在实际项目开发中 , 经常会遇到订单接收处理、发送通知等场景 , 研发人员经常会借助多线程的方式 , 来提高程序的处理性能 。
例如:付款业务订单处理的场景 。
很显然 , 在采用生产者消费者模型 , 进行业务处理时 , 能够解耦订单接收与订单处理的线程 , 在一定程度上能够缓解性能瓶颈对系统性能带来的影响 。
例如:系统监控报警通知场景 。
privatefinalstaticExecutorServiceEXEC=Executors.newFixedThreadPool(5);publicstaticvoidasynSend(finalStringemail,finalStringtitle,finalStringcontent){EXEC.execute(newRunnable(){@Overridepublicvoidrun(){try{sendTextEmail(email,title,content,null);LOGGER.info("发送邮件{}成功!",email);}catch(Exceptione){LOGGER.error("发送邮件{},失败原因是{}",email,e);}}});}随意摘的一段通过Email方式进行通知用户的代码 , 能够清楚的看到 , 发送的任务交给线程池去处理 , 进而提高程序的性能 。
【幻化成蝶|全要靠线程带,Java程序跑的快】仅以上面两个业务场景 , 简单描述多线程的使用场景 。 而回归到生活本质 , 单线程程序如同只雇佣一个服务员的餐厅 , 他必须做完一件事情后才可以做下一件事情;而多线程程序则如同雇佣多个服务员的餐厅 , 各司其职 , 分工明确 , 可以同时进行多件事情 , 效率肯定会提高 。
而在项目研发时 , 为什么多数同学未曾亲自开发过线程相关的代码模块呢?原因是在Java的世界里 , 很多复杂的东西都已被大佬们封装在框架或者组件里啦(eg:Tomcat、Canal、Spring全家桶等) , 所以你只管利用好框架或组件 , 好好开发业务就好了 。
创建方式:“茴”字有四种写法 , 线程有几种创建方式呢?在Java的世界里 , 大家最熟悉的线程的创建方式 , 莫过于Java提供的Thread类和Runnable接口 。
方式一:继承Thread类创建线程 。
//1.定义Thread类的子类classNotifyThreadextendsThread{//2.重写Thread类的run方法 , 该方法代表了线程需要完成的任务 。 @Overridepublicvoidrun(){System.out.println("报警通知");}}/***线程创建的方式 , soeasy!*@author一猿小讲*/publicclassNotifyService{publicstaticvoidmain(String[]args){//3.创建线程对象 , 并调用线程对象的start方法启动线程newNotifyThread().start();}}方式二:实现Runnable接口创建线程 。
//1.定义Runnable接口的实现类classNotifyThreadimplementsRunnable{//2.实现该接口的run方法 , 该方法是线程的执行体 。 publicvoidrun(){System.out.println("报警通知");}}/***线程创建的方式 , soeasy!*@author一猿小讲*/publicclassNotifyService{publicstaticvoidmain(String[]args){//3.创建Runnable实现类的实例NotifyThreadnotifyThread=newNotifyThread();//4.将创建的实例作为Thread的target来创建Thread对象newThread(notifyThread).start();}}面试考点:方式一vs方式二 。


推荐阅读