標籤:dea 地址 效率 tac uil 本地 啟動 如何 使用者
進程
運行中的應用程式叫進程,每個進程運行時,都有自已的地址空間(記憶體空間)
如IE瀏覽器在任務管器中可以看到
作業系統都是支援多進程的
線程
線程是輕量級的進程,是進程中一個負責程式執行的控制單元
線程沒有獨立的地址空間(記憶體空間)
線程是由進程建立的(寄生在進程中)
一個進程可以擁有多個線程,至少一個線程
線程有幾種狀態(建立new,就緒Runnable,運行Running,阻塞Blocked,死亡Dead)
開啟多個線程是為了同時運行多部分代碼,每個線程都有自已的啟動並執行內容,這個內容可以稱線程要執行的任務(放在run()方法中)
多線程
多線程是指程式中包含多個執行流,即在一個程式中可以同時運行多個不同的線程來執行不同的任務,也就是說允許單個程式建立多個並存執行的線程來完成各自的任務。
多線程的好處
Java支援編寫多線程的程式;
多線程最大的好處在於可以同時並發執行多個任務;
多線程可以最大限度地減低CPU的閑置時間,從而提高CPU的利用率。
多線程的不利方面
線程也是程式,所以線程需要佔用記憶體,線程越多佔用記憶體也越多;
多線程需要協調和管理,所以需要CPU時間跟蹤線程;
線程之間對共用資源的訪問會相互影響,必須解決競用共用資源的問題;
線程太多會導致控制太複雜,最終可能造成很多Bug。
Java建立線程的二種方式
第一種:繼承Thread類的方式
步驟:1)建立一個類繼承Thread
2)覆寫run方法 目的是存放多線程要執行的自訂代碼。
3)在main函數中建立該類
4)使用start()方1法調用該線程(start方法有兩種含義:1,啟動多線程。2,調用線程中的run方法)
第二種:實現Runnable介面的方式
步驟:
1)建立類實現Runnable介面
2)實現Runnable介面中的run方法
3)建立Thread對象
4)將Runnable對象作為實際參數傳遞給Thread的構造方法
5)調用Thread類的start方法,自動執行Runnable對象中的run方法
得到線程的名字:getName(),Thread的方法
當前執行的線程:currentThread()
設定線程的名字:setName("名字");
線程優先順序:
Thread類有如下三個靜態變數來表示優先順序
MAX_PRIORITY:取值為10,表示最高優先順序
MIN_PRIORITY:取值為1,表示最低優先順序
NORM_PRIORITY:取值為5,表示預設的優先順序
用數字設定優先權:setPriority(1);
用靜態變數設定優先權:setPriority(MAX_PRIORITY);
獲得優先順序:getPriority();
安全執行緒問題產生的原因:
多個線程操作共用資料
共用資料的線程代碼有多條
當一個線程在執行操作共用資料的多條代碼過程中,其它線程參與了運算,就會導致線程的安全問題的產生
線程同步有兩種方法:
1.同步語句塊:只對這個地區塊的資源實行互斥訪問
synchronized(共用對象名){
被同步的程式碼片段
}
它鎖定的是共用對象名對應的當前對象,線程中實現同步塊一般是在run方法中添加。
2.使用synchronized修飾的方法:
存取修飾詞 synchronized 資料傳回型別 方法名(){
...
}
它鎖定的是調用這個同步方法的對象。其他線程不能同時訪問這個對象中任何一個synchronized方法。
線程死結的概念
指的是兩個線程互相持有對方依賴的共用資源,造成無限阻塞。導致死結的根源在於不適當的運用synchronized關鍵字來管理線程對特定對象的訪問。
解決死結的方法
讓線程持有獨立的資源。
盡量不採用嵌套的synchronized語句。
死結要通過通過優良的設計來盡量降低死結的發生。
線程通訊:指的是多個線程通過訊息傳遞實現相互牽制,相互調度,即線程間的相互作用。
通過Object類的方法wait()--導致當前線程等待、notify()--喚醒等待的線程,和synchronized一起使用來達成效果
sleep():Thread的靜態方法,必須指定時間。讓本線程進入睡眠模式,到時間就醒。不會釋放同步鎖。
wait():Object的方法,可以指定也可以不指定時間。讓本線程進入等待狀態,需要有人叫醒notify()。會釋放同步鎖。
yield ( )
線程A名.yield( )
線程A讓出cpu的使用權,讓其它線程執行(不是絕對的)
注意:這二個線程必須是同一優先順序的
join( )
join:哪個線程調用join()方法,哪個線程就先執行完,
1)一個線程A調用join()方法時,main線程後執行
2)二個線程A,B都調用join()方法時 ,A與B相互搶著執行,main線程最後執行
注意:join()方法要在start()之後寫,才起作用
setDaemon()
守護線程 :
守護線程是守護主線程(main)的,主線程結束,不管守護線程當前是什麼狀態都隨之結束
一個線程要調用 setDaemon(true);//參數是true時是守護線程
注意:setDaemon(true)方法必須在start()之前使用
C/S B/S 區別?
C/S (Client/Server):該結構軟體,用戶端伺服器端都要編寫,開發成本高,維護麻煩,好處是用戶端在本地可以分擔一部分運算
B/S (Browser/Server):該結構軟體只開發服務端,不開發用戶端,因為用戶端直接由瀏覽器取代,開發成本低,維護更簡單,缺點是所有的運算都在伺服器端完成,加大了服務端的負擔
String StringBuffer StringBuilder
對於三者使用的總結:
1.如果要操作少量的字元資料,或對字串修改不多情況下用 String,最為適合
2.如果要操作大量的字元資料,或對字串修改比較多的情況下用BufferBuilder 因為它帶緩衝區,由於StringBuilder線程不全安,所以當我們項目用的是多線程時不要用BufferBuilder,StringBuilder的執行效率比較快
3.多線程操作字串緩衝區下操作大量資料 = StringBuffer
clone()建立並返回此對象的一個副本。
可以複製一個對象,即建立一個對象的副本,要使類的對象能夠複製,類必須實現Cloneable介面。
BigInteger類
位於Java.math包中
用於計算非常大的整數用的
BigInteger big1 = new BigInteger("12345676134896413132");
BigInteger big2 = new BigInteger("123");
BigInteger big3= big1.multiply(big2);
System.out.println(big3);
BigDecimal類
位於Java.math包中
用於計算非常大的浮點數用的
BigDecimal big1 = new BigDecimal("12345676134896413132.02");
BigDecimal big2 = new BigDecimal("123.36");
BigDecimal big3= big1.multiply(big2);
System.out.println(big3)
Collections和Collection的區別?
Collection:集合類的介面
Collections:操作集合用的類,這個類裡有很多static的方法,這些方法大多對List操作,主要包括排序,重排,尋找等。
Arrays類定義了對數組進行操作的方法,包括對數組進行排序尋找。
Arrays類:
排序:sort():對數組中的內容進行升序排序
尋找:binarySearch(數組):利用對數組中的內容進行尋找(二分尋找法),注意數組中的數值要有順序(從小到大或從大到小)
Collections類:
排序:sort():對數組中的內容進行升序排序
尋找:binarySerach(集合):利用對數組中的內容進行尋找(二分尋找法),注意數組中的數值要有順序(從小到大或從大到小)
封裝性:
封裝性是物件導向的一個重要特徵,在java中,對象就是一組變數和方法的封裝,其中變數描述對象的狀態,方法描述對象的行為。通過對象的封裝,使用者不必瞭解對象是如何?的,只需要通過對象提供的介面與對象進行互動就可以了,封裝性實現了模組化和資訊隱藏,有利於程式的可移植性和對象的管理。
在Java中,對象的封裝是通過如下2種方式實現的:
1)通過包實現封裝,它定義了程式類的存取權限
2)通過類或類的成員的存取權限實現封裝性。
Random
Random類,用於產生隨機數。
位置於java.util包下
構造方法摘要
Random()建立一個新的隨機數產生器。
Random(long seed)使用單個 long 種子建立一個新的隨機數產生器。
方法:
intnextInt()返回下一個偽隨機數,它是此隨機數產生器的序列中均勻分布的 int 值。
intnextInt(int n)返回一個偽隨機數,它是取自此隨機數產生器序列的、在 0(包括)和指定值(不包括)之間均勻分布的 int 值。
longnextLong()返回下一個偽隨機數,它是取自此隨機數產生器序列的均勻分布的 long 值。
boolean nextBoolean()返回下一個偽隨機數,它是取自此隨機數產生器序列的均勻分布的 boolean 值。
voidnextBytes(byte[] bytes)產生隨機位元組並將其置於使用者提供的 byte 數組中。
double nextDouble()返回下一個偽隨機數,它是取自此隨機數產生器序列的、在 0.0 和 1.0 之間均勻分布的 double 值。
floatnextFloat()返回下一個偽隨機數,它是取自此隨機數產生器序列的、在 0.0 和 1.0 之間均勻分布的 float 值。
堆(heap)和棧(stack)的區別
1)棧中存入局部變數,數組或對象的引用變數,及方法
2)堆存放著new 建立的對象(及全域變數)和數組
3)棧中的資料,超出範圍後,會自動清除
4)堆中的資料,超出範圍後,不會自動清除,由記憶體回收行程不定時回收
5)棧先進後出,堆先進先出
JAVA多線程及補充