標籤:java 多線程 並發 thread
概念:
1.線程:程式中單獨順序的控制流程
線程本身依靠程式進行運行
線程是程式中的順序控制流程,只能使用分配給程式的資源和環境
2.進程:執行中的程式
一個進程可以包含一個或多個線程
一個進程至少要包含一個線程
3.單線程:程式中只存在一個線程,實際上主方法就是一個主線程
4.多線程:多線程是一個程式中運行多個任務
多線程的目的是更好的使用CPU資源
線程的狀態:
建立狀態:準備好了一個多線程的對象;
就緒狀態:調用了start()方法,等待CPU調度;
運行狀態:執行run()方法;
阻塞狀態:暫時停止執行,可能將資源交給其他線程使用;
終止狀態(死亡狀態):線程銷毀;
線程常用方法:
1.取得線程名稱getName()
2.取得當前線程對象currentThread()
3.判斷線程是否啟動isAlive()
4.線程的強行運行join()
5.線程的休眠sleep()
6.線程的礼讓yield()
線程的同步與死結:
1.同步代碼塊
在代碼塊上加上"synchronized"關鍵字,則此代碼塊就稱為同步代碼塊
2.同步代碼塊格式
synchronized(同步對象){
需要同步的代碼塊;
}
3.同步方法
除了代碼塊可以同步,方法也可以同步的
4.方法同步格式
synchronized void 方法名稱(){}
線程的同步經典樣本:
類比某車站有三個視窗同時賣票,總票數為10張,賣完為止,代碼如下:
//賣票線程class MyThread implements Runnable {// 原始票數為10張票private int ticket = 10;@Overridepublic void run() {// 死迴圈賣票while (true) {if (ticket > 0) {try {Thread.sleep(500);System.out.println(Thread.currentThread().getName()+ "賣掉一張票...");} catch (Exception e) {e.printStackTrace();}System.out.println("剩餘票數:" + --ticket);} else {// 票已經賣完,視窗停止售票break;}}}}public class Test001 {public static void main(String[] args) {// 現在有三個視窗同時在賣票MyThread r = new MyThread();Thread t1 = new Thread(r, "視窗一");Thread t2 = new Thread(r, "視窗二");Thread t3 = new Thread(r, "視窗三");// 開始並發賣票t1.start();t2.start();t3.start();}}
程式運行結果如下:
視窗一賣掉一張票...剩餘票數:9視窗三賣掉一張票...剩餘票數:8視窗二賣掉一張票...剩餘票數:7視窗一賣掉一張票...剩餘票數:6視窗三賣掉一張票...剩餘票數:5視窗二賣掉一張票...剩餘票數:4視窗三賣掉一張票...剩餘票數:3視窗一賣掉一張票...剩餘票數:2視窗二賣掉一張票...剩餘票數:1視窗一賣掉一張票...剩餘票數:0視窗三賣掉一張票...剩餘票數:-1視窗二賣掉一張票...剩餘票數:-2
因為三個視窗是並發賣票,所以當票只剩下一張的時候,三個視窗同時去賣它,就會造成剩餘票數變成負數,這個時候就需要同步的訪問這個車票資源來解決這個問題,代碼修正後如下:
//賣票線程class MyThread implements Runnable {// 原始票數為10張票private int ticket = 10;@Overridepublic void run() {// 死迴圈賣票while (true) {synchronized (this) {if (ticket > 0) {try {Thread.sleep(500);System.out.println(Thread.currentThread().getName()+ "賣掉一張票...");} catch (Exception e) {e.printStackTrace();}System.out.println("剩餘票數:" + --ticket);} else {// 票已經賣完,視窗停止售票break;}}}}}public class Test001 {public static void main(String[] args) {// 現在有三個視窗同時在賣票MyThread r = new MyThread();Thread t1 = new Thread(r, "視窗一");Thread t2 = new Thread(r, "視窗二");Thread t3 = new Thread(r, "視窗三");// 開始並發賣票t1.start();t2.start();t3.start();}}
程式運行結果如下:
視窗一賣掉一張票...剩餘票數:9視窗一賣掉一張票...剩餘票數:8視窗一賣掉一張票...剩餘票數:7視窗三賣掉一張票...剩餘票數:6視窗三賣掉一張票...剩餘票數:5視窗三賣掉一張票...剩餘票數:4視窗二賣掉一張票...剩餘票數:3視窗二賣掉一張票...剩餘票數:2視窗二賣掉一張票...剩餘票數:1視窗二賣掉一張票...剩餘票數:0
Java之多線程