520特篇-愛的境界


  本文的主旨在於通過對實際生活中的例子做抽象來說明熱愛能夠對學習技術起到的作用及所能達到的程度。文章后半部分用具體項目做例子一來介紹並行的知識點二來說明主題。謹以此篇獻給熱愛工作熱愛技術的你。

  老公當初剛和我在一起的時候,很多人跑來問我要不要考慮和他們在一起。因為當時我在東軟是不管什么事情只要參加,大獎肯定是我的。內部期刊上經常是我的身影。東軟商用那年人特別多,大概快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點多,早晨還要上班,今天分析的很淺,有空補上。僅表達一種境界,包括為了追求技術不眠不休:-)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM