JUDE還是很好用的
? JUDE的一個下載地址:
?? http://jude.change-vision.com/jude-web/product/community.html
posted @ 2006-07-23 15:27 binge 閱讀(898) | 評論 (1) | 編輯 收藏
拾貝殼走過的路
隨筆 - 39, 文章 - 1, 評論 - 14, 引用 - 0
|
JUDE還是很好用的
?? 沒有華麗的Rose,也沒有Togather,用JUDE的感覺也不錯.剛剛把PicoContainer反向了.可惜,好東西都陸續(xù)要收費(fèi)了.只能用用Community /Free 版.
? JUDE的一個下載地址: ?? http://jude.change-vision.com/jude-web/product/community.html posted @ 2006-07-23 15:27 binge 閱讀(898) | 評論 (1) | 編輯 收藏 PicoContainer源碼導(dǎo)讀
摘要: 一、簡介?? 感謝“簡易java框架”分享的學(xué)習(xí)心得。循著他的足跡,我把picocontainer讀了一遍。源代碼的版本是1.2-RC-2。?? pico的官方站點(diǎn):http://www.picocontainer.org/?? 由于它是一個專門的ioc容器,所以使用起來沒有spring那么麻煩。關(guān)于他的文檔,在官方站點(diǎn)上有一篇《5分鐘搞定pico》的文章。國人似乎也有很多的翻譯版本。講解得很詳細(xì)... 閱讀全文
posted @ 2006-07-23 14:30 binge 閱讀(3019) | 評論 (0) | 編輯 收藏 一個簡單的ThreadPool分析
一個簡單的ThreadPool
? 原文來自http://www.informit.com/articles/printerfriendly.asp?p=30483&r1=1&rl=1 ? 項(xiàng)目是多線程的,所以引入了線程池這個東西。池子是個老美寫的。在項(xiàng)目中表現(xiàn)的還不錯。所以把它摘出來,介紹給以后或許需要用到它的同行們。 ? 關(guān)于為什么要采用ThreadPool,原文已經(jīng)提到了:創(chuàng)建一個線程是需要開銷的;如果線程數(shù)量過大的話,cpu就會浪費(fèi)很大的精力做線程切換。 ? ThreadPool的實(shí)現(xiàn)過程就是對WorkerThread的同步和通信的管理過程。 ? 我們來看代碼。 ? 首先,在ThreadPool構(gòu)造的時候,創(chuàng)建10個WorkerThread(size=10)并讓他們運(yùn)行。每個WorkerThread線程都有個ThreadPool的引用,用于查詢ThreadPool的狀態(tài)和獲得同步鎖.WorkerThread運(yùn)行以后,循環(huán)調(diào)用ThreadPool的方法進(jìn)行查詢,如果沒有發(fā)現(xiàn)任務(wù),ThreadPool告訴正在查詢的線程進(jìn)入休眠狀態(tài),WorkerThread釋放對查詢方法的鎖定.這樣在還沒有任務(wù)的時候,所有的10個WorkerThread都會進(jìn)入休眠狀態(tài),進(jìn)入等待ThreadPool對象的等待鎖定池,只有ThreadPool對象發(fā)出notify方法(或notifyAll)后WorkerThread線程才進(jìn)入對象鎖定池準(zhǔn)備獲得對象鎖進(jìn)入運(yùn)行狀態(tài)。 代碼片斷: while ( !assignments.iterator().hasNext() ) ??? wait(); 如果你有jprofile或者其他的觀察線程的工具,你可以看到有10個線程都在休眠狀態(tài). ? 接著,我們向ThreadPool中加入任務(wù),這些任務(wù)都實(shí)現(xiàn)了Runnable的run方法.(至于為什么把任務(wù)都做成Runnable,譯者至今也有些疑問?預(yù)定俗成?TimerTask也是實(shí)現(xiàn)自Runnable,弄得初學(xué)者經(jīng)常把真正運(yùn)行的線程搞混).ThreadPool每assign一個任務(wù),就會發(fā)出一條消息,通知它的等待鎖定池中的線程.各個線程以搶占的方式獲得對象鎖,然后很順利的獲得一條任務(wù).并把此任務(wù)從ThreadPool里面刪除.沒有搶到的繼續(xù)等待. Runnable r = (Runnable)assignments.iterator().next(); ?? assignments.remove(r); WorkerThread從ThreadPool那里獲得了任務(wù),繼續(xù)向下執(zhí)行。 target = owner.getAssignment(); ?? if (target!=null) { ??? target.run();????? ??? owner.done.workerEnd(); ?? } 記住,這里調(diào)用的是target.run();而不是調(diào)用的線程的start()方法。也就是說在這里表現(xiàn)出的WorkerThread和task之間的關(guān)系僅僅是簡單的方法調(diào)用的關(guān)系,并沒有額外產(chǎn)生新線程。(這就是我上面納悶為什么大家都實(shí)現(xiàn)Runnable來做task的原因) ?大家可能注意到,WorkerThread并沒有對異常作處理。而我們知道發(fā)生在線程上的異常會導(dǎo)致線程死亡。解決的辦法有2中,一種是通過threadpool的管理來重新激起一個線程,一種是把異常在線程之內(nèi)消滅。在項(xiàng)目中,我采用的是第二中,因此這個片斷改稱這樣: if (target!=null) { ? try{ ??? target.run();????? ?? } ? catch(Throwable t){ ?....... ?? } ??? owner.done.workerEnd(); } 在WorkerThread完成一個task以后,繼續(xù)循環(huán)作同樣的流程. 在這個ThreadPool的實(shí)現(xiàn)里面,Jeff Heaton用了一個Done類來觀察WorkerThread的執(zhí)行情況.和ThreadPoool的等待鎖定池不同,Done的等待鎖定池里面放的是初始化ThreadPool的線程(可能是你的主線程),我們叫他母線程. ? 在給出的測試?yán)又?母線程在調(diào)用complete()方法后進(jìn)入休眠(在監(jiān)視中等待),一開始是waitBegin()讓他休眠,在assign加入task以后,waitDone()方法讓他休眠.在WorkerThread完成一個task以后,通知waitDone()起來重新檢查activeThreads的數(shù)值.若不為0,繼續(xù)睡覺.若為0,那么母線程走完,死亡(這個時候該做的task已經(jīng)做完了).母線程走完,ThreadPool還存在嗎?答案是存在,因?yàn)閃orkerThread還沒有消亡,他們在等待下一批任務(wù),他們有ThreadPool的引用,保證ThreadPool依然存在.大家或許已經(jīng)明白Done這個類的作用了. ? 細(xì)心的讀者或許會發(fā)現(xiàn),發(fā)生在Done實(shí)例上的notify()并不是像ThreadPool上的notify()那樣每次都能完成一項(xiàng)工作.比如除了第一個被assign的task,其他的task在assign進(jìn)去的時候,發(fā)出的notify()對于waitDone()來說是句"狼來了". ?最后在ThreadPool需要被清理得時候,使每一個WorkerThread中斷(這個時候或許所有的WorkerThread都在休眠)并銷毀.記住這里也是一個異步的過程.等到每一個WorkerThread都已經(jīng)銷毀,finalize()的方法體走完.ThreadPool被銷毀. ?for (int i=0;i<threads.length;i++) { ?? threads[i].interrupt(); ?? done.workerBegin(); ?? threads[i].destroy(); ? } ? done.waitDone(); 為什么有句done.workerBegin();?不明白. 參考文章: http://www.zdnet.com.cn/developer/common/printfriend/printfriendly.htm?AT=39276905-3800066897t-20000560c posted @ 2006-07-16 20:07 binge 閱讀(7188) | 評論 (1) | 編輯 收藏 關(guān)于作者
??? 呂華兵,男,24歲。
??? 2000-2004年,在中國民航大學(xué)讀書。學(xué)習(xí)期間,筆者以技術(shù)部長身份參與了校易航工作室暨易航網(wǎng)站的創(chuàng)建和發(fā)展工作,參與和獨(dú)立完成了多個項(xiàng)目的設(shè)計(jì)和開發(fā)。 ?? 2004年5月到2006年5月,在北京環(huán)亞時代(港新合資)天津軟件中心從事Java的開發(fā)工作。參與了CMCC的OA的實(shí)施工作,主力開發(fā)了MOCHA AM的前端顯示和MOCHA ITAM的報(bào)表系統(tǒng)。 ? 2006年5月至今,在美國易達(dá)軟件有限公司工作。設(shè)計(jì)并開發(fā)了Information Publisher的多線程后端程序。 ?? ? 筆者長期從事j2se,j2ee的開發(fā)工作,對各種設(shè)計(jì)模式亦有豐富的使用經(jīng)驗(yàn)。 ? 筆者從來重視規(guī)范的軟件流程,對RUP有很深的理解。 ? 對于javascript,dhtml,ajax,筆者有著豐富的經(jīng)驗(yàn)。 ? 筆者也是“拿來主義”的擁躉,不遺余力的翻譯、學(xué)習(xí)、使用和宣傳各種開源項(xiàng)目。目前使用過的開源項(xiàng)目有:spring、picocontainer、hibernate、ibatis、struts、webwork等框架系列,DOM系列,commons系列,Quartz,log4j,ant,oscache,proxool以及各種報(bào)表工具等等。 ?筆者從來重視知識的提取和積累,這也是筆者開此blog的主要原因,同時,也希望通過此blog結(jié)交更多的朋友。 posted @ 2006-07-16 10:15 binge 閱讀(416) | 評論 (0) | 編輯 收藏 關(guān)于GWT的第一手經(jīng)驗(yàn)譯者安:你敢大膽采用最新的技術(shù)嗎?你顧慮哪些方面?下面的采訪將給我們提供一個參考。 posted @ 2006-07-08 13:47 binge 閱讀(1172) | 評論 (0) | 編輯 收藏 java.util.Date和java.sql.Date
java.sql.Date,java.sql.Time和java.sql.Timestamp三個都是java.util.Date的子類(包裝類)。
但是為什么java.sql.Date類型的值插入到數(shù)據(jù)庫中Date字段中會發(fā)生數(shù)據(jù)截取呢? java.sql.Date是為了配合SQL DATE而設(shè)置的數(shù)據(jù)類型。“規(guī)范化”的java.sql.Date只包含年月日信息,時分秒毫秒都會清零。格式類似:YYYY-MM-DD 當(dāng)我們調(diào)用ResultSet的getDate()方法來獲得返回值時,java程序會參照"規(guī)范"的java.sql.Date來格式化數(shù)據(jù)庫中的數(shù)值。因此,如果 數(shù)據(jù)庫中存在的非規(guī)范化部分的信息將會被劫取。在sun提供的ResultSet.java中這樣對getDate進(jìn)行注釋的: Retrieves the value of the designated column in the current row of this <code>ResultSet</code> object as a “java.sql.Date” object in the Java programming language. 同理。如果我們把一個java.sql.Date值通過PrepareStatement的setDate方法存入數(shù)據(jù)庫時,java程序會對傳入的java.sql.Date規(guī)范化 ,非規(guī)范化的部分將會被劫取。 ?然而,我們java.sql.Date一般由java.util.Date轉(zhuǎn)換過來,如:java.sql.Date sqlDate=new java.sql.Date(new java.util.Date().getTime()). ?顯然,這樣轉(zhuǎn)換過來的java.sql.Date往往不是一個規(guī)范的java.sql.Date. ?在http://www.thunderguy.com/semicolon/2003/08/14/java-sql-date-is-not-a-real-date/ 文章中提到,要保存java.util.Date的精確值, ?我們需要利用java.sql.Timestamp. ?感謝這篇文章的鋪墊:http://community.csdn.net/Expert/topic/4354/4354971.xml?temp=.5256616 posted @ 2006-07-06 16:51 binge 閱讀(4288) | 評論 (0) | 編輯 收藏 log4j配置概要
官方網(wǎng)址:
http://logging.apache.org/log4j/docs/index.html 一個中文翻譯的文檔: http://www.jaxwiki.org/zh/project/logging.apache.org/log4j/docs/manual.html 我摘出黃色字體表明幾條列在下面,也是筆者認(rèn)為log4j最主要特點(diǎn)的濃縮: 1.階層式的命名: 如果一個logger 的名字后面跟著一個點(diǎn)號(dot),它就是點(diǎn)號(dot)后面的那個logger的前輩( ancestor),是這個晚輩(descendant) 的前綴。如果在它自己和這個晚輩之間沒有其它的前輩,它和這個晚輩之間就是父子關(guān)系。 2.級別繼承 對于一個給定的logger C,它繼承的級別等于logger階層里,從C開始往 3.執(zhí)行規(guī)則 在一個級別為q(被指定的或繼承的)的logger里,一個級別為p的日志請求,只有在p >= q 時才能夠被執(zhí)行。 Logger C的log輸出信息將被輸出到C的所有appenders和它的前輩的 appenders。這就是"appender additivity"的意思。但是,如果logger C的前輩,比如說P,P的additivity flag被設(shè)置為 log4j.appender.A1.layout.ConversionPattern=%d %-5p [%t] %-c (%13F:%L) %3x - %m%n 在配置文件中,log4j可以訪問到系統(tǒng)環(huán)境變量。具體的變量參考相關(guān)資料。 posted @ 2006-07-04 10:07 binge 閱讀(533) | 評論 (0) | 編輯 收藏 Mysql數(shù)據(jù)庫使用技巧 我承認(rèn)我用mysql有很長時間了,不過似乎我仍然很白。好吧,還是寫寫吧。 posted @ 2006-07-03 23:16 binge 閱讀(1446) | 評論 (2) | 編輯 收藏 關(guān)于異常Exception1。什么是異常 posted @ 2006-06-29 11:40 binge 閱讀(1407) | 評論 (1) | 編輯 收藏 XMLBeans
?XmlBeans由 BEA公司發(fā)明,后捐贈給Apache基金會的。
?在項(xiàng)目中遇到這樣的需求,根據(jù)已有的schema對xml進(jìn)行格式校驗(yàn),并讀取出xml得數(shù)據(jù)。 ?在大搜一番后,我最終把目光停留在xmlbeans上面。被淘汰的是digester. ?下面是一篇dev2dev得文章: ??http://dev2dev.bea.com/pub/a/2006/05/xmlbeans-2.html?page=4 ?我就不炒飯了。 ?好心的人給簡單翻譯了一下: http://dev2dev.bea.com.cn/techdoc/200403127.html ?翻譯得內(nèi)容很少,有空本人補(bǔ)上。 ibm dw上也有個豆腐塊: http://www-128.ibm.com/developerworks/cn/xml/x-beans1/ 關(guān)于digester的內(nèi)容,只選了一篇文章:來自devx得 http://www.devx.com/Java/Article/21832/1763 關(guān)于2中方法的對比,他們的文章已經(jīng)說的很詳細(xì)了。 xmlbeans采用的是sax來讀取數(shù)據(jù)。2004年,由bea公司發(fā)明的stax(stream API for XML)已經(jīng)被jcp列為標(biāo)準(zhǔn)jsr-173,在jdk6.0中會出現(xiàn)。 ? 關(guān)于stax,sax和dom的對比超出本篇范圍,在此略過。 后記: ? 在正在完成的項(xiàng)目中,我采用了xmlbeans,它的引入給我?guī)砹撕艽蟮姆奖? posted @ 2006-06-21 13:50 binge 閱讀(632) | 評論 (0) | 編輯 收藏 |
|