1、進程與線程
進程第指在系統中正在運行的一個應用程序,線程是比進程更小的執行單位
一個進程可以產生多個線程,多線程機制使程序運行效率變得更高
多線程好處:解決了多部分代碼同時運行的問題
多線程弊端:線程太多,單個線程運行效率降低
2、多線程實現的方式:
a、繼承Thread類----本身是線程資源還是個線程
1、子類重寫父類中的run方法,將線程運行的代碼存放在run中
2、建立子類對象的同時線程也被創建
3、通過調用start方法開啓線程
start方法調用線程,run執行線程代碼
4、子類重寫Thread的run方法
eg:ThreadDemo th=new ThreadDemo("nana");
th.start();
一個線程類對象只能調用一次線程。
b、實現Runnable 接口----本身是線程資源不是線程
1、子類覆蓋接口中的run方法
2、通過Thread類創建線程,並將實現了Runnable接口的子類對象作爲參數
傳遞給Thread類的構造函數
3、Thread類對象調用start方法開啓線程
eg:ThreadDemo2 td = new ThreadDemo2();
new Thread(td).start();
new Thread(td).start();
兩種方式的區別:繼承Thread類受單繼承影響,不適合多個線程共享資源
實現Runnable接口方便資源共享
c、實現Callable接口通過FutureTask包裝器來創建Thread線程
d-線程池
eg:ThreadDemo td=new ThreadDemo();
ExecutorService es=Executors.newFixedThreadPool(3);//創建線程池,池裏有3個線程
es.execute(td);//調用線程
3、線程的四種狀態
被創建(就緒)
運行
凍結
消亡
sleep方法需要指定睡眠時間,單位是毫秒
wait()方法需要被notify()方法喚醒
4、線程操作方法
public static Thread currentThread();//返回當前線程
public final String getName();//返回當前線程名稱
public final void setPriority(int priority);//設置線程優先級
提高線程搶佔CPU資源的可能性(1,5,10),但是並不代表一定可以搶到
public void start();//開始執行線程
public static void sleep(long m);//使用目前的線程休眠
public final void yield();//線程的禮讓,暫定當前線程,讓其他線程先運行
public void run();//執行線程
5、Object是所有類的祖先,包含以下對線程操作相關的方法
public final void wait();//線程等待
public final void wait(long timeout);//線程等待,並指定等待時間
public void notify();//喚醒第一個等待的線程
public void notifyAll();//喚醒全部等待的線程
6、線程同步
同步:在同一時間段內只能運行一個線程。可以解決線程中的安全問題
前提:同步需要兩個或者兩個以上的線程
多個線程使用的是同一個資源
未滿足上述兩個條件不能成爲同步
同步的弊端:當線程相當多時,因爲每個線程都會去判斷同步上的鎖,這
是很耗費資源的,無形中會降低程序運行的效率
線程同步:同步代碼塊、同步方法
同步代碼塊:synchronized(同步對象 類名.class){ 需要同步的代碼 }
synchronized鎖住的是括號裏的對象,而不是代碼。
eg:synchronized (TickedSell2.class) {
if (t>0) {
System.out.println("票號"+t--);
}
}
同步方法:把代碼塊做成方法,然後再調用
7、線程死鎖:
彼此佔用對方所需要的資源,雙方進行不下去
8、常用的線程池使用方法
public static ExecutorService newFixedThreadPool(int nThreads)
創建固定數目線程的線程池。
public static ExecutorService newCachedThreadPool()
創建一個可緩存的線程池,調用execute 將重用以前構造的線程(如果線程可用)。如果現有線程沒有可用的,則創建一個新線程並添加到池中。終止並從緩存中移除那些已有 60 秒鐘未被使用的線程。
public static ExecutorService newSingleThreadExecutor()
創建一個單線程化的Executor。
public static
ScheduledExecutorService newScheduledThreadPool(int
corePoolSize)
創建一個支持定時及週期性的任務執行的線程池,多數情況下可用來替代Timer類。