本文的主旨在于通过对实际生活中的例子做抽象来说明热爱能够对学习技术起到的作用及所能达到的程度。文章后半部分用具体项目做例子一来介绍并行的知识点二来说明主题。谨以此篇献给热爱工作热爱技术的你。
老公当初刚和我在一起的时候,很多人跑来问我要不要考虑和他们在一起。因为当时我在东软是不管什么事情只要参加,大奖肯定是我的。内部期刊上经常是我的身影。东软商用那年人特别多,大概快2万人了。日语考试我都是考第一的,甩出第二名好多分。所以很多人觉得优秀的人应该和在他们眼里优秀的人在一起。对于他们我只是笑笑,心里很清楚自己眼里的优秀是什么样子,我要的东西他们给不了。
老公性格腼腆。09年刚从日本回来的时候,手机没开通来电显示,有天晚上看到手机上有未接来电,我感觉到这是一个很重要的电话,但是现在不是时候。那年五一我在苏州玩,当时相机存储空间满了,我就在QQ上问几个同事谁在,我把拍的大的视频传过去。当时我记得好多人在,我至少传给了6个人,其中就有他。当时我也就是随便一说,说端午节的时候可以一起出去玩。结果我从苏州回来他马上开始找我说中午一起吃饭,商量端午节一起出去玩的事情。一商量一个月,每天都以此为借口和我一起吃饭。后来我知道那个电话是他打的,从日本回来他就打算找我的,但是我当时在思考一个很重要的事情,确实不是时候。
我需要他就会出现。比如宿舍停电了,突然感觉有些凄凉的时候他的短信就来了,告诉我他在我楼下。我在悬崖边的大石头上下不来的时候,他会正好经过把我抱下来。
他对我的包容和接纳。刚开始的时候我让他了解了我所有的缺点,包括不收拾屋子,不化妆,不护肤,早上就是清水洗一把脸,洗面奶都不用。他接受的那么坦然。在我俩的婚礼上,他站在台上说今天他娶了最善良最聪明的女孩。我站在台下眼泪花了妆。他所在意的不是外貌,不是懂事,不是性格这些需要修炼的东西。善良,聪明都是与生俱来的。既然我可以不用努力就能永远善良永远聪明,那我只要做我自己就好。
他的付出。老公说我要比他决定要和我在一起的时候想象的好很多。每次我们出去玩如果上次他付的帐,下次我会抢着付。我买自己用的东西从来不花他的钱。他说他本以为追我会花很多钱,已经准备好花光自己所有的积蓄。我信他不只是说说,因为我说我不想在沈阳的时候,他去来北京找工作。当时他只带了2000块钱,剩下的都留在了银行卡里。而银行卡和密码交给了我。那是09年6月底,我们接触的时间还很短。在沈阳的时候,市中心离我们的软件园30公里吧,好像。我不喜欢坐公交,他骑车一路上坡带我去市里。每次到市里自行车就坏了,只能送去修。如果不是因为要来北京,他都已经打算好买辆超好的自行车专门为了载我去市里玩。
爱情是很神奇的事情。老公会比我自己更了解我自己。所以开始的时候我一点都没想到在其他事情上,他的学习思考能力要差很多。老公有次去面试测了智商,IQ测试101,其他面试的都在110多。但是只要是处理关于我的事情上,他的脑子出奇的好使。有种逃不出他五指山的感觉。让我感觉他给了我无限的自由,最终却会心甘情愿的老老实实待在他身边。
这是一种境界。当将一个人或者一件事作为生命中唯一重要的事情,奇迹就发生了。不会有真爱一个人不会表达不知道如何去爱,只有不够爱。因为真爱不会权衡利弊,所以只是需要解决怎样表达怎样去爱。如果一个人白天想晚上想,时时刻刻都在想,又怎么会想不到解决方法。我在想:假如当初是我先看上了我老公。他自卑,怯懦,不敢爱我我该怎么办。我想我会先问他做过最出格的事情是什么。然后会带他夜里去翻人家墙,然后再问他到目前你做过的最出格的事情是什么。然后再带他去做更大胆的事情,直到他的脸上写满放松和自信。然后我还会带他去做很多不可思议的事情直到他爱上我。瞧~~,只要足够爱,总有解决问题的方法。
文本转载自静儿1986的文章,原文链接:http://www.cnblogs.com/xiexj/p/6876401.html
技术的学习也是如此。用了心就一定能达到自己理想的境界。我爱我的工作,所以我会做到下面几点:
☆ 积极的做项目
☆ 做过的东西反复琢磨
☆ 看完一本书后要再次梳理项目
☆ 手别懒,看到例子没一眼看明白就要动手实践
☆ 记录项目中潜在的问题每隔一段时间回来想一想
☆ 工匠精神:代码当成艺术品反复优化
☆ 沉住气把项目做深
技术先从并行说起。并行不同于并发,这个大家都知道。我的理解:并发是问题,主要需要解决同一时刻的数据同步和性能瓶颈。并行是一起执行,大多时候是为了提高执行速度。回忆起自己第一个用并行来解决问题是在人人的时候。当时自己负责网页的首页和profile聚合页。就像博客园首页一样,一个页面有很多不同来源的数据拼在一起展示在页面上,显然串行来加载速度太慢了,当时我就用了一个Future来异步加载,线程内部捕获处理所有异常,设定超时返回时间,正常情况下可以将所有结果独立的加载返回,标志位为true。其他情况结果为空,标志位为false。返回页面后对于结果为False会用ajax异步请求再次去取一次数据,实在取不到就算了,一小块儿不显示而已。
这里再插一个和学习有关的一个小插曲。上面的项目是我在后来开APEC会议的雁栖湖封闭开发时做的这个项目。当时领导来找我问我要不要去封闭开发做一个新项目。我还没反应过怎么回事,直接领导就给挡回去了,说她本人同意家属不同意。当时自己项目经验很少,手头项目也都在维护阶段,很清闲。所以等我定了定神儿,大体明白了是个什么事情,我就去找领导主动说我要去。其实都知道封闭开发很苦,每周休息一天,基本都是不愿意去的。但是,首先自己在岗位上要实现自己的价值,然后有付出才有提高。当我处于总结阶段的时候,更多的是把知识编织于做过的项目。下面就是怎样编织于项目的:
/** * <pre> * ********************************************************************************************************* * 版权所有(C) 2010 BSNS * 保留所有权利。 * .==. .==. * //'^\ //^'\ * // ^^(\__/)/^ ^^\ * //^ ^^ ^/6 6 ^^^ \ * //^ ^^ ^/( .. )^ ^^ \ * // ^^ ^/|v""v|/^^ ^ \ * // ^^// / '~~' /^ ^\ * ---------------------------------------- * HERE BE DRAGONS WHICH CAN CREATE MIRACLE * ********************************************************************************************************* * 基本信息 * ********************************************************************************************************* * 系统:BRMAYI * 模块:BRMAYI CONCURRENT * 功能:用ExecutorService来执行FutureTask返回执行结果的异步例子 * 编码:静儿(xiexiaojing@le.com) * 时间: 2010.10.13 * ********************************************************************************************************* * 修改历史 * ********************************************************************************************************* * 修改者 修改内容 修改时间 * 静儿(xiexiaojing@le.com) 新建 2010.10.13 * ********************************************************************************************************* * </pre> */ public class Application { public static void main(String[] args) { FutureTask<Map<String,String>> futureTask1 = new FutureTask<Map<String,String>>(new RealData("name1")); FutureTask<Map<String,String>> futureTask2 = new FutureTask<Map<String,String>>(new RealData("name2")); ExecutorService executor = Executors.newCachedThreadPool(); executor.submit(futureTask1); executor.submit(futureTask2); try { System.out.println(futureTask1.get(1, TimeUnit.MINUTES)); System.out.println(futureTask2.get(1, TimeUnit.MINUTES)); } catch (Exception e) { e.printStackTrace(); } executor.shutdown(); } }
这段代码只是举个例子,当时框架是struts,实例都是容器注入的,里面用了线程控制,工厂模式等一些技术将这个功能提炼成了一个通用的简易并行框架了。后来做的很多项目就直接拿来用了。
☆ 并行知识点1:Runnable和Callable的异同
功能相同:都是接口(不是废话,意味着有需要自己实现的方法,接口是不需要研究实现原理的,它只有设计理念),都是用来编写多线程
功能不同:实现Callable能返回执行结果,而Runnable不能。Callable的call接口允许抛出异常,而Runnable只能内部消化
调用相同:都可以将实例对象传给FutureTask或者ExecutorService来管理
调用不同:Runnable更为基础,Thread只能传Runnable对象。Runnable实例对象交由FutureTask对象来管理或者使用ExecutorService的submit返回一个国定的结果,结果是作为参数传入的。而Callable返回的结果是程序执行后的结果。ExecutorService在Runnable传入时可接受无结果的参数,调用submit默认返回空串。
☆ 并行知识点2:FutureTask和Future的异同
根本异同在于Future是个接口,而FutureTask实现了这个接口,同时还实现了Runnable接口。而Future对象定义了cancel, isCancelled, isDone, get和有超时时间的get五个方法。其中cancel方法,可以传入一个叫:“是否可以中断”的参数。FutureTask除了Future之外,就是run方法了。run方法是将Runnable或者是Callable的实例具体执行的过程。
☆ 并行知识点3:ExecutorService的execute和submit的异同
功能相同:都是添加线程到线程池中
功能不同:submit返回future,而execute没有返回值。因为future对象可以取消,也可以判断是否取消,是否完成。也可以通过future返回值来判断。
☆ 并行知识点4:ExecutorService的shutdown和shutdownNow的区别
当线程池调用shutdown方法时,线程池立即变成shutdown状态,不再往线程池里添加新任务,否则会抛出RejectedExecutionException,但是线程池会在池中所有任务都处理完毕才退出。
当线程池调用shutdownNow方法时,线程池立即变成stop状态,并试图停止所有正在执行的线程,不再处理并返回线程池中等待的任务。因为停止线程是通过Thread的中断方法来实现,所以不能保证会立即停止。
☆ 并行知识点5:java中断机制
上面的future的cancel方法参数为true和线程池的shutdownNow方法都用到了Thread.interrupt()方法。它只是设置标志位。需要线程自己去对标志位检测和响应。它只停掉线程中有sleep,wait,join的方法。
做程序最需要考虑的事情是什么呢?当然是如何改进。Java8中引入lambda函数式编程和增强型的CompletableFuture。看看使用这个的语法:
/** * <pre> * ********************************************************************************************************* * 版权所有(C) 2010 BSNS * 保留所有权利。 * .==. .==. * //'^\ //^'\ * // ^^(\__/)/^ ^^\ * //^ ^^ ^/6 6 ^^^ \ * //^ ^^ ^/( .. )^ ^^ \ * // ^^ ^/|v""v|/^^ ^ \ * // ^^// / '~~' /^ ^\ * ---------------------------------------- * HERE BE DRAGONS WHICH CAN CREATE MIRACLE * ********************************************************************************************************* * 基本信息 * ********************************************************************************************************* * 系统:BRMAYI * 模块:BRMAYI CONCURRENT * 功能:用ExecutorService来执行FutureTask返回执行结果的异步例子 * 编码:静儿(xiexiaojing@le.com) * 时间: 2010.10.13 * ********************************************************************************************************* * 修改历史 * ********************************************************************************************************* * 修改者 修改内容 修改时间 * 静儿(xiexiaojing@le.com) 新建 2017.05.19 * ********************************************************************************************************* * </pre> */ public class Application { public static Map<String,String> call(String name){ Map<String,String> a = new HashMap<String,String>(); a.put(name, name); return a; } public static void main(String[] args) { try { final CompletableFuture<Map<String,String>> future1 = CompletableFuture.supplyAsync(()->call("name1")); final CompletableFuture<Map<String,String>> future2 = CompletableFuture.supplyAsync(()->call("name2")); System.out.println(future1.get(1, TimeUnit.MINUTES)); System.out.println(future2.get(1, TimeUnit.MINUTES)); } catch (Exception e) { e.printStackTrace(); } } }
因为现在已经凌晨3点多,早晨还要上班,今天分析的很浅,有空补上。仅表达一种境界,包括为了追求技术不眠不休:-)