1. 程式人生 > >多線程——講的不錯,認認真真做的筆記,認真再看!

多線程——講的不錯,認認真真做的筆記,認真再看!

es2017 文件 pan mode 體驗 效率 href blank 能夠

一、線程和進程

進程可以看成是一個運行中的程序,每個應用就是一個運行的程序,可以看成是一個進程。操作系統會為每個進程分配內存空間和CPU時間等。多任務支持了多進程。線程成為輕量級的進程,有自己的運行環境。線程存在於進程中,每個進程最少有一個線程,線程分享進程的資源。例如程序中同時進行數據讀取和數據處理,這樣能夠提高效率,這時候就需要兩個線程。

二、java中的多線程實現的方式

java中提供了兩種實現線程的方式:
  • 通過繼承Thread類實現多線程
1、繼承Thread類實現線程類,需要覆蓋run方法 public class MyThread extends Thread{ public void run(){ //定義線程要執行的代碼 } } 2、通過線程類創建線程對象: Thread t=new MyThread(); Thread t=new MyThread("線程的名字"); 3、線程的啟動通過start方法實現看下面這個例子1:
  • 這個結果就是,main主線程開始,然後進行其他的線程,主線程結束,由於系統分配著進行時間,所以兩個線程穿插交替進行,可以運行一下體驗一下,如圖下面:技術分享
  • 通過實現Runable接口實現多線程
1、需要實現run方法 public class MyThread2 implements Runable{ public void run(){ //定義線程要執行的代碼 } } 2、創建線程對象: Thread tt=new MyThread(new MyThread2()); 3、線程的啟動通過start方法實現看下面的例子2。
經過實踐可以,跟上面那個結果類似

三、線程的名字

  • 通過繼承Thread類實現多線程
class MyThread extends Thread{ public MyThread(String name){ super(name); } ...... }
  • 通過實現Runable接口實現多線程
MyRunnable r=new MyRunnable(); Thread t3=new Thread(r,"線程3");
  • 通過Thread對象的setName方法設置
  • 調用getName方法得到線程的名字
  • 例子6.3線程名字的使用

四、線程的優先級

  • 默認情況下,一個程序的多個線程具有相同的優先級,也就是獲得CPU的概率相同。可以通過設置線程的優先級來調整每個線程獲得CPU的機會大小。
  • 調用線程的setPriority方法設置優先級,參數表示優先級。優先級的最小值是1,最大的值是9,默認值是5。
  • 需要設置優先級的情況比較少。
  • 例子(6.4)線程的優先級

五、讓線程等待

根據需要可以讓線程等待一段時間再執行,可以通過4種方式:
  • 使用sleep讓線程等待一段時間
  • 使用yield方法讓線程讓出執行機會
  • 使用join讓線程等待
  • wait方法與notity一起使用,在後面單獨介紹,這裏介紹3個
技術分享
技術分享
技術分享例子6.8——輸出結果0
例子6.9——輸出結果5

六、實例:實現人能夠同時說話和開車

技術分享

七、資源同步

多線程的問題...int tickets = getTicket(); (1)setTickets(tickets-1); (2)...假設A線程和B線程分別表示兩個售票窗口,可能的執行過程如下:A線程執行(1),B線程執行(1),A線程執行(2),B線程執行(2),資源同步可以使用關鍵詞synchronized,相當於對資源加鎖,加鎖之後其他代碼就不能訪問了,只有等當前代碼執行完之後並解鎖,其他的代碼才能訪問。synchronized可以用在對象上,也可以用在方法上,也可以用在一段代碼上。例子:6.11在對象上加鎖
6.12在方法上加鎖

八、wait和notify

某個線程在執行的過程中發現需要的資源不可用的時候,就需要等待,調用資源的wait方法,讓當前線程處於等待狀態。處於等待狀態的線程自己不能繼續執行,必須等待其它線程喚醒它,其他線程通過notify或者notifyAll方法來喚醒。技術分享Producer.java
這個項目Java文件已加載為附件

附件列表

    多線程——講的不錯,認認真真做的筆記,認真再看!