總想提筆寫點什么,卻不知道該怎樣記錄這幾個月的生活。滿腦的思緒卻無從下筆,只是感覺找工作也不是自己想的那么容易。看著一起找工作的人都找到了,就自己沒有找到合適的,就慢慢的開始懷疑自己,對生活和未來喪失信心。不過還好懂得,人最不能放棄的就是希望,好多事情盡了自己最大的努力就好。
多線程的概念
一、程序與進程
1、程序:一段靜態的代碼。
2、進程:程序的一次動態執行過程,它對應從代碼加載、執行到執行完畢的一個完整過程。
3、進程也稱任務,支持多個進程同時執行的OS就被稱為多進程OS或多任務OS。
二、進程與線程
在一個程序內部也可以實現多個任務并發執行,其中每個任務稱為線程。
線程是比進程更小的執行單位,它是在一個進程中獨立的控制流,即程序內部的控制流。
特點:線程不能獨立運行,必須依賴于進程,在進程中運行。
每個程序至少有一個線程稱為主線程。
單線程:只有一條線程的進程稱為單線程
多線程:有不止一個線程的進程稱為多線程
三、開啟多線程的優點和缺點
提高界面程序響應速度。通過使用線程,可以將需要大量時間完成的流程在后臺啟動單獨的線程完成,提高前臺界面的相應速度。
充分利用系統資源,提高效率。通過在一個程序內部同時執行多個流程,可以充分利用CPU等系統資源,從而最大限度的發揮硬件的性能。
當程序中的線程數量比較多時,系統將花費大量的時間進行線程的切換,這反而會降低程序的執行效率。但是,相對于優勢來說,劣勢還是很有限的,所以現在的項目開發中,多線程編程技術得到了廣泛的應用。
多線程實現
一、在實現線程編程時,首先需要讓一個類具備多線程的能力,繼承Thread類或實現Runnable接口的類具備多線程的能力,然后創建線程對象,調用對應的啟動線程方法即可實現線程編程。
在一個程序中可以實現多個線程,多線程編程指在同一個程序中啟動了兩個或兩個以上的線程。
在實際實現線程時,Java語言提供了三種實現方式:
(1)繼承Thread類
(2)實現Runnable接口
(3)使用Timer和TimerTask組合
二、繼承Thread線程類實現多線程
java.lang包中提供了一個專門的線程類(Thread),在該類中封裝了許多對線程進行調度和處理的方法。如果一個類繼承了Thread類,則該類就具備了多線程的能力,可以多線程的方式執行。
線程的特性:隨機性,系統在執行多線程程序時只保證線程是交替執行的,至于哪個線程先執行哪個線程后執行,則無法獲得保證,需要書寫專門的代碼才可以保證執行的順序。
對于同一個線程類,也可以啟動多個線程
同一個線程不能啟動兩次,
當自定義線程中的run方法執行完成以后,則自定義線程自然死亡。而對于系統線程來說,只有當main方法執行結束,而且啟動的其它線程都結束以后,才會結束。當系統線程執行結束以后,程序的執行才真正結束。
三、 實現Runable接口
a) 多線程對象實現java.lang.Runnable接口并且在該類中重寫Runnable接口的run方法。
b) 好處:實現Runable接口的方法避免了單繼承的局限性。
例1:使用實現Runable接口的方式實現多線程。
一、線程的生命周期
線程是一個動態執行的過程,它也有一個從產生到死亡的過程,這就是所謂的生命周期。一個線程在它的生命周期內有5種狀態:
1、新建(new Thread)
當創建Thread類的一個實例(對象)時,此線程進入新建狀態(未被啟動)。
例如:Thread t1=new Thread();
2、就緒(runnable)
線程已經被啟動,正在等待被分配給CPU時間片,也就是說此時線程正在就緒隊列中排隊等候得到CPU資源。例如:t1.start();
3、運行(running)
線程獲得CPU資源正在執行任務(run()方法),此時除非此線程自動放棄CPU資源或者有優先級更高的線程進入,線程將一直運行到結束。
4、死亡(dead)
當線程執行完畢或被其它線程殺死,線程就進入死亡狀態,這時線程不可能再進入就緒狀態等待執行。
自然終止:正常運行run()方法后終止
異常終止:調用stop()方法讓一個線程終止運行
5、堵塞(blocked)
由于某種原因導致正在運行的線程讓出CPU并暫停自己的執行,即進入堵塞狀態。
正在睡眠:用sleep(long t) 方法可使線程進入睡眠方式。一個睡眠著的線程在指定的時間過去可進入就緒狀態。
正在等待:調用wait()方法。(調用motify()方法回到就緒狀態)
被另一個線程所阻塞:調用suspend()方法。(調用resume()方法恢復)
JSP中一共預先定義了9個這樣的對象,分別為:request、response、session、application、out、pagecontext、config、page、exception
1、request對象
request 對象是 javax.servlet.httpServletRequest類型的對象。 該對象代表了客戶端的請求信息,主要用于接受通過HTTP協議傳送到服務器的數據。(包括頭信息、系統信息、請求方式以及請求參數等)。request對象的作用域為一次請求。
2、response對象
response 代表的是對客戶端的響應,主要是將JSP容器處理過的對象傳回到客戶端。response對象也具有作用域,它只在JSP頁面內有效。
3、session對象
session 對象是由服務器自動創建的與用戶請求相關的對象。服務器為每個用戶都生成一個session對象,用于保存該用戶的信息,跟蹤用戶的操作狀態。session對象內部使用Map類來保存數據,因此保存數據的格式為 “Key/value”。 session對象的value可以使復雜的對象類型,而不僅僅局限于字符串類型。
4、application對象
application 對象可將信息保存在服務器中,直到服務器關閉,否則application對象中保存的信息會在整個應用中都有效。與session對象相比,application對象生命周期更長,類似于系統的“全局變量”。
5、out 對象
out 對象用于在Web瀏覽器內輸出信息,并且管理應用服務器上的輸出緩沖區。在使用 out 對象輸出數據時,可以對數據緩沖區進行操作,及時清除緩沖區中的殘余數據,為其他的輸出讓出緩沖空間。待數據輸出完畢后,要及時關閉輸出流。
6、pageContext 對象
pageContext 對象的作用是取得任何范圍的參數,通過它可以獲取 JSP頁面的out、request、reponse、session、application 等對象。pageContext對象的創建和初始化都是由容器來完成的,在JSP頁面中可以直接使用 pageContext對象。
7、config 對象
config 對象的主要作用是取得服務器的配置信息。通過 pageConext對象的 getServletConfig() 方法可以獲取一個config對象。當一個Servlet 初始化時,容器把某些信息通過 config對象傳遞給這個 Servlet。 開發者可以在web.xml 文件中為應用程序環境中的Servlet程序和JSP頁面提供初始化參數。
8、page 對象
page 對象代表JSP本身,只有在JSP頁面內才是合法的。 page隱含對象本質上包含當前 Servlet接口引用的變量,類似于Java編程中的 this 指針。
9、exception 對象
exception 對象的作用是顯示異常信息,只有在包含 isErrorPage="true" 的頁面中才可以被使用,在一般的JSP頁面中使用該對象將無法編譯JSP文件。excepation對象和Java的所有對象一樣,都具有系統提供的繼承結構。exception 對象幾乎定義了所有異常情況。在Java程序中,可以使用try/catch關鍵字來處理異常情況; 如果在JSP頁面中出現沒有捕獲到的異常,就會生成 exception 對象,并把 exception 對象傳送到在page指令中設定的錯誤頁面中,然后在錯誤頁面中處理相應的 exception 對象。
1.接口體現的是一種規范,而抽象類體現的是一種模板式設計。
2.接口里只能包含抽象方法,不包含已經提供實現的方法。而抽象類則完全可以包含普通方法。
3.接口里不能定義靜態方法,抽象類里面可以定義靜態方法。
4.接口里只能定義靜態常量屬性,不能定義普通屬性。而抽象類可以定義普通屬性也可以定義靜態常量屬性。
5.接口不包含構造器,而抽象類可以包含構造器。構造器不是為了用來創建對象,而是子類調用這些構造器來完成抽象類的初始化工作。