1. 程式人生 > >JAVA多線程及補充

JAVA多線程及補充

線程死鎖 面向 封裝 摘要 long build random類 比較 current

進程
運行中的應用程序叫進程,每個進程運行時,都有自已的地址空間(內存空間)
如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 種子創建一個新的隨機數生成器。
方法:
int nextInt()返回下一個偽隨機數,它是此隨機數生成器的序列中均勻分布的 int 值。
int nextInt(int n)返回一個偽隨機數,它是取自此隨機數生成器序列的、在 0(包括)和指定值(不包括)之間均勻分布的 int 值。
long nextLong()返回下一個偽隨機數,它是取自此隨機數生成器序列的均勻分布的 long 值。
boolean nextBoolean()返回下一個偽隨機數,它是取自此隨機數生成器序列的均勻分布的 boolean 值。
void nextBytes(byte[] bytes)生成隨機字節並將其置於用戶提供的 byte 數組中。
double nextDouble()返回下一個偽隨機數,它是取自此隨機數生成器序列的、在 0.0 和 1.0 之間均勻分布的 double 值。
float nextFloat()返回下一個偽隨機數,它是取自此隨機數生成器序列的、在 0.0 和 1.0 之間均勻分布的 float 值。

堆(heap)和棧(stack)的區別
1)棧中存入局部變量,數組或對象的引用變量,及方法
2)堆存放著new 創建的對象(及全局變量)和數組
3)棧中的數據,超出作用域後,會自動清除
4)堆中的數據,超出作用域後,不會自動清除,由垃圾回收器不定時回收
5)棧先進後出,堆先進先出

JAVA多線程及補充