新浪部落格搬家過來的東西
雜七雜八複習一
1、 子類能繼承父類的構造器嗎?構造方法可以被重寫嗎?
不能。子類不能繼承父類構造器,也不能重寫構造方法。子類構造的開始位置如果不寫super呼叫父類構造,JVM會隱式的呼叫無參構造;如果此時父類沒有無參構造,就會報錯。
2.SpringMVC那塊獲取頁面值得幾種方法
1)request.getParameter()方法來獲取
2)Controller的方法裡的引數如果名字和頁面傳送請求的值得name相同,會自動賦值,如果名字不同,可以通過註解@RequestParam繫結請求引數
3)利用自動轉載機制,將頁面值裝載入實體類
把eclipse普通專案修改為Web專案
昨天試著將匯入到Eclipse普通專案通過設定改為Web專案,現在記下來**。
1.專案檔案下.project 配置檔案標籤下追加三個子標籤,如下:
org.eclipse.wst.common.project.facet.core.nature
org.eclipse.wst.common.modulecore.ModuleCoreNature
org.eclipse.jem.workbench.JavaEMFNature
2.在Eclipse中專案上右鍵點選屬性,選擇 Project Facets,在右側選擇 Dynamic Web Module和Java,記住選擇了Dynamic Web Module後在最右側要選擇Runtimes執行環境為Apache Tomcat。
3.之後專案中出現Web Content,直接刪除。
4.再進入專案檔案,.settings資料夾,org.eclipse.wst.common.component裡修改source-path為Web-Root
[轉載]Commons-logging能幫我們做什麼
程式碼應該怎麼寫?
我們在需要輸出日誌資訊的“每一人”類中做如下的三個工作:
1、匯入所有需的commongs-logging類:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
如果願意簡化的話,還可以兩行合為一行:
import org.apache.commons.logging.*;
2、在自己的類中定義一個org.apache.commons.logging.Log類的私有靜態類成員:
private static Log log = LogFactory.getLog(YouClassName.class);
注意這裡定義的是static成員,以避免產生多個例項。
LogFactory.getLog()方法的引數使用的是當前類的class,這是目前被普通認為的最好的方式。為什麼不寫作LogFactory.getLog(this.getClass())?因為static類成員訪問不到this指標!
3、使用org.apache.commons.logging.Log類的成員方法輸出日誌資訊:
log.debug(“111”);
log.info(“222”);
log.warn(“333”);
log.error(“444”);
log.fatal(“555”);
這裡的log,就是上面第二步中定義的類成員變數,其型別是org.apache.commons.logging.Log,通過該類的成員方法,我們就可以將不同性質的日誌資訊輸出到目的地(目的地是哪裡?視配置可定,可能是stdout,也可能是檔案,還可能是傳送到郵件,甚至傳送簡訊到手機……詳見下文對log4j.properties的介紹):
l debug() 輸出“除錯”級別的日誌資訊;
l info() 輸出“資訊”級別的日誌資訊;
l warn() 輸出“警告”級別的日誌資訊;
l error() 輸出“錯誤”級別的日誌資訊;
l fatal() 輸出“致命錯誤”級別的日誌資訊;
根據不同的性質,日誌資訊通常被分成不同的級別,從低到高依次是:“除錯(DEBUG)”“資訊(INFO)”“警告(WARN)”“錯誤(ERROR)”“致命錯誤(FATAL)”。為什麼要把日誌資訊分成不同的級別呢?這實際上是方便我們更好的控制它。比如,通過Log4j的 配置檔案,我們可以設定“輸出‘除錯’及以上級別的日誌資訊”(即“除錯”“資訊”“警告”“錯誤”“致命錯誤”),這對專案開發人員可能是有用的;我們 還可以設定“輸出“警告”及以上級別的日誌資訊”(即“警告”“錯誤”“致命錯誤”),這對專案終端使用者可能是有用的。
僅從字面上理解,也可以大致得出結論:最常用的應該是debug()和info();而warn()、error()、fatal()僅在相應事件發生後才使用。
從上面三個步驟可以看出,使用commons-logging的日誌介面非常的簡單,不需要記憶太多東西:僅僅用到了兩個類Log, LogFactory,並且兩個類的方法都非常少(後者只用到一個方法,前者經常用到的也只是上面第三步中列出的幾個),同時引數又非常簡單。
上面所介紹的方法是目前被普通應用的,可以說是被標準化了的方法,幾乎所有的人都是這麼用。如果不信,或想確認一下,就去下載幾個知名的Java開源專案原始碼看一下吧。
基礎:多執行緒
1.什麼是程序?什麼是執行緒?
–程序是作業系統中的一個任務,一個應用程式執行在一個程序中,它是包含了某些資源的記憶體區域。
–執行緒是程序的一個順序執行流,程序中所包含的一個或多個執行單元稱為執行緒。
–一個程序至少包含一個執行緒。
2.程序與執行緒:
①程序是作業系統級別的多工,一個程序就是作業系統中的一個任務。
執行緒是程序裡的多工。
②程序獨享記憶體,有獨立的記憶體空間。
執行緒共享程序的所有的記憶體(應該是堆記憶體),無獨立記憶體。
③跨程序難,切換速度相對較慢。
跨執行緒容易,切換速度快。
④程序必須至少包含一個執行緒。
3.執行緒的五大狀態
新建new、就緒Runnable、阻塞Block、執行Running、死亡Dead
4.建立執行緒的兩種方式
–繼承Thread類,重寫run方法;
直接new的方法建立執行緒,比較方便,但是由於Java是單一繼承的,所以會造成繼承衝突問題,而且任務和執行緒具有較強的耦合關係。
–實現Runnable介面,實現run方法;
這種方式比較靈活,不會造成繼承的衝突,並且沒有必然的耦合關係,擴充套件性好。
5.啟動執行緒用start()方法還是run()方法?start方法
run方法是執行緒要執行的任務,啟動執行緒則是呼叫start方法。我們不會直接呼叫run方法,該方法是線上程啟動起來後,第一次分配時間片時自動呼叫的。
當執行緒的start方法被呼叫後,run方法會很快被呼叫,但不是start呼叫的過程中run方法被執行。執行緒排程會盡可能均勻的將執行緒分配給併發執行的執行緒,但不保證一人一次交替分配。對於我們而言,執行緒排程將時間片分配給哪個執行緒我們不可控,時間片長短也不可控。對於執行緒而言,只能被動等待分配時間片,不能主動獲取。
6.sleep() ,wait() && notify() [這兩個方法定義在Object中] 、 join()
(1)sleep方法:靜態方法,使執行該方法的執行緒阻塞制定毫秒,超時後,執行緒再回到Runnable狀態,等待再次分配時間片後繼續執行。
(2)wait && notify:當一個執行緒呼叫了一個物件(任意物件)的wait方法時,該執行緒進入阻塞狀態,直到該物件的notify方法被呼叫,這個執行緒才會解除阻塞繼續向下執行。[下載並顯示圖片那個案例,顯示圖片的執行緒呼叫obj的wait方法,直到圖片下載完畢,下載圖片的執行緒裡呼叫obj的notify方法,圖片才繼續顯示]
(3)join方法:將制定的執行緒加入當前執行緒,可以將兩個交替執行的執行緒合併為順序執行的執行緒。
比如呼叫制定執行緒的join方法,會等待該執行緒結束後再執行當前執行緒。
7.yield方法:
使當前執行緒主動讓出當次cpu時間片,回到Runnable狀態
8.synchronized
1)可以給方法加鎖,或者使用同步程式碼塊。
當一個方法被synchronized修飾之後,該方法變為同步方法。意思是任何情況下不會出現兩個以上的執行緒在該方法內部執行的情況。
2)如何提高併發效率:儘可能在允許的情況下減小同步範圍以提高併發效率。
3)靜態方法鎖:
靜態方法鎖鎖的是類物件(類名.class)。所以靜態方法任何時候都有同步效果。
靜態方法和非靜態方法同時聲明瞭synchronized,他們之間是非互斥關係,因為一個鎖的是類物件,一個鎖的是當前方法所屬的物件。
9.將集合和Map轉換為執行緒安全的,使用集合的工具類 Collections
Collections.synchronizedList(list) ;
Collections.synchronizedSet(set) ;
Collections.synchronizedMap(map) ;
10.執行緒池
建立:
ExecutorService threadPool = Executors.newFixedThreadPool(2) ;
使用:
threadPool.execute(runn) ;
結束執行緒池:
threadPool.shutdown() ;