91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

并發編程:線程與多線程必知必會

發布時間:2020-06-18 00:56:19 來源:網絡 閱讀:260 作者:Java_老男孩 欄目:編程語言

1 線程與多線程

線程是什么?
線程(Thread)是一個對象(Object)。用來干什么?Java 線程(也稱 JVM 線程)是 Java 進程內允許多個同時進行的任務。該進程內并發的任務成為線程(Thread),一個進程里至少一個線程。

Java 程序采用多線程方式來支持大量的并發請求處理,程序如果在多線程方式執行下,其復雜度遠高于單線程串行執行。那么多線程:指的是這個程序(一個進程)運行時產生了不止一個線程。

為啥使用多線程?

  • 適合多核處理器。一個線程運行在一個處理器核心上,那么多線程可以分配到多個處理器核心上,更好地利用多核處理器。
  • 防止阻塞。將數據一致性不強的操作使用多線程技術(或者消息隊列)加快代碼邏輯處理,縮短響應時間。

聊到多線程,多半會聊并發與并行,咋理解并區分這兩個的區別呢?

  • 類似單個 CPU ,通過 CPU 調度算法等,處理多個任務的能力,叫并發
  • 類似多個 CPU ,同時并且處理相同多個任務的能力,叫做并行

2 線程的運行與創建

2.1 線程的創建

Java 創建線程對象有兩種方法:
– 繼承 Thread 類創建線程對象
– 實現 Runnable 接口類創建線程對象

新建 MyThread 對象,代碼如下:

/**
 * 繼承 Thread 類創建線程對象
 * @author Jeff Lee @ bysocket.com
 * @since 2018年01月27日21:03:02
 */
public class MyThread extends Thread {

    @Override // 可以省略
    public void run() {
        System.out.println("MyThread 的線程對象正在執行任務");
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            MyThread thread = new MyThread();
            thread.start();

            System.out.println("MyThread 的線程對象 " + thread.getId());
        }
    }
}

MyThread 類繼承了 Thread 對象,并重寫(Override)了 run 方法,實現線程里面的邏輯。main 函數是使用 for 語句,循環創建了 10 個線程,調用 start 方法啟動線程,最后打印當前線程對象的 ID。

run 方法和 start 方法的區別是什么呢?
run 方法就是跑的意思,線程啟動后,會調用 run 方法。
start 方法就是啟動的意思,就是啟動新線程實例。啟動線程后,才會調線程的 run 方法。

執行 main 方法后,控制臺打印如下:

MyThread 的線程對象正在執行任務
MyThread 的線程對象 10
MyThread 的線程對象正在執行任務
MyThread 的線程對象 11
MyThread 的線程對象正在執行任務
MyThread 的線程對象 12
MyThread 的線程對象正在執行任務
MyThread 的線程對象 13
MyThread 的線程對象正在執行任務
MyThread 的線程對象 14
MyThread 的線程對象正在執行任務
MyThread 的線程對象 15
MyThread 的線程對象正在執行任務
MyThread 的線程對象 16
MyThread 的線程對象正在執行任務
MyThread 的線程對象 17
MyThread 的線程對象正在執行任務
MyThread 的線程對象 18
MyThread 的線程對象正在執行任務
MyThread 的線程對象 19

可見,線程的 ID 是線程唯一標識符,每個線程 ID 都是不一樣的。

start 方法和 run 方法的關系如圖所示:
并發編程:線程與多線程必知必會

同理,實現 Runnable 接口類創建線程對象也很簡單,只是不同的形式。新建 MyThreadBrother 代碼如下:

/**
 * 實現 Runnable 接口類創建線程對象
 * @author Jeff Lee @ bysocket.com
 * @since 2018年01月27日21:22:57
 */
public class MyThreadBrother implements Runnable {

    @Override // 可以省略
    public void run() {
        System.out.println("MyThreadBrother 的線程對象正在執行任務");
    }

    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(new MyThreadBrother());
            thread.start();

            System.out.println("MyThreadBrother 的線程對象 " + thread.getId());
        }
    }
}

具體代碼:java-concurrency-core-learning

2.1 線程的運行

在運行上面兩個小 demo 后,JVM 執行了 main 函數線程,然后在主線程中執行創建了新的線程。正常情況下,所有線程執行到運行結束為止。除非某個線程中調用了 System.exit(1) 則被終止。

在實際開發中,一個請求到響應式是一個線程。但在這個線程中可以使用線程池創建新的線程,去執行任務。

并發編程:線程與多線程必知必會

3 線程的狀態

新建 MyThreadInfo 類,打印線程對象屬性,代碼如下:

/**
 * 線程實例對象的屬性值
 * @author Jeff Lee @ bysocket.com
 * @since 2018年01月27日21:24:40
 */
public class MyThreadInfo extends Thread {

    @Override // 可以省略
    public void run() {
        System.out.println("MyThreadInfo 的線程實例正在執行任務");
//        System.exit(1);
    }

    public static void main(String[] args) {
        MyThreadInfo thread = new MyThreadInfo();
        thread.start();

        System.out.print("MyThreadInfo 的線程對象 \n"
                + "線程唯一標識符:" + thread.getId() + "\n"
                + "線程名稱:" + thread.getName() + "\n"
                + "線程狀態:" + thread.getState() + "\n"
                + "線程優先級:" + thread.getPriority());
    }
}

執行代碼打印如下:

MyThreadInfo 的線程實例正在執行任務
MyThreadInfo 的線程對象 
線程唯一標識符:10
線程名稱:Thread-0
線程狀態:NEW
線程優先級:5

線程是一個對象,它有唯一標識符 ID、名稱、狀態、優先級等屬性。線程只能修改其優先級和名稱等屬性 ,無法修改 ID 、狀態。ID 是 JVM 分配的,名字默認也為 Thread-XX,XX是一組數字。線程初始狀態為 NEW。

線程優先級的范圍是 1 到 10 ,其中 1 是最低優先級,10 是最高優先級。不推薦改變線程的優先級,如果業務需要,自然可以修改線程優先級到最高,或者最低。

線程的狀態實現通過 Thread.State 常量類實現,有 6 種線程狀態:new(新建)、runnnable(可運行)、blocked(阻塞)、waiting(等待)、time waiting (定時等待)和 terminated(終止)。狀態轉換圖如下:

并發編程:線程與多線程必知必會

線程狀態流程大致如下:

  • 線程創建后,進入 new 狀態
  • 調用 start 或者 run 方法,進入 runnable 狀態
  • JVM 按照線程優先級及時間分片等執行 runnable 狀態的線程。開始執行時,進入 running 狀態
  • 如果線程執行 sleep、wait、join,或者進入 IO 阻塞等。進入 wait 或者 blocked 狀態
  • 線程執行完畢后,線程被線程隊列移除。最后為 terminated 狀態。

4 小結

本文介紹了線程與多線程的基礎篇,包括了線程啟動及線程狀態等。下一篇我們聊下線程的具體操作。包括中斷、終止等

文末彩蛋

針對于上面所涉及到的知識點我總結出了有1到5年開發經驗的程序員在面試中涉及到的絕大部分架構面試題及答案做成了文檔和架構視頻資料免費分享給大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并發等架構技術資料),希望能幫助到您面試前的復習且找到一個好的工作,也節省大家在網上搜索資料的時間來學習,也可以關注我一下以后會有更多干貨分享。

資料獲取方式 QQ群搜索“708-701-457” 即可免費領取

并發編程:線程與多線程必知必會
并發編程:線程與多線程必知必會
并發編程:線程與多線程必知必會

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

峡江县| 类乌齐县| 大港区| 荣昌县| 楚雄市| 客服| 那曲县| 绥德县| 凤翔县| 平远县| 阳信县| 武乡县| 永寿县| 临沂市| 大名县| 桂林市| 肥城市| 错那县| 宿州市| 罗定市| 岗巴县| 黔东| 永嘉县| 南华县| 安康市| 宝应县| 阳谷县| 龙岩市| 连云港市| 平江县| 浦县| 招远市| 沂水县| 池州市| 盐山县| 玉门市| 茂名市| 金湖县| 横山县| 淅川县| 师宗县|