進程
運行中的應用程序叫進程,每一個進程運行時,都有自已的地址空間(內存空間)
如IE瀏覽器在任務管器中能夠看到
操做系統都是支持多進程的java
線程
線程是輕量級的進程,是進程中一個負責程序執行的控制單元
線程沒有獨立的地址空間(內存空間)
線程是由進程建立的(寄生在進程中)
一個進程能夠擁有多個線程,至少一個線程
線程有幾種狀態(新建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();
線程安全問題產生的緣由:
多個線程操做共享數據
共享數據的線程代碼有多條
當一個線程在執行操做共享數據的多條代碼過程當中,其它線程參與了運算,就會致使線程的安全問題的產生dom
線程同步有兩種方法:
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)棧先進後出,堆先進先出