Java之多線程

來源:互聯網
上載者:User

標籤: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之多線程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.