多線程(一)-兩種創建線程的方式

来源:https://www.cnblogs.com/xiaoqigui/archive/2022/06/20/16393353.html
-Advertisement-
Play Games

大佬的理解->Java多線程(一)多線程基礎 大佬的理解->Java多線程(二)常用的實現多線程的兩種方式 1、繼承Thread類 ​ 繼承Thread必須重寫run方法,(具體業務執行方法,需要執行的業務方法,定義在此方法中),註意此方法是線程啟動後線程自動調用的; 案例 public class ...


大佬的理解->Java多線程(一)多線程基礎

大佬的理解->Java多線程(二)常用的實現多線程的兩種方式

1、繼承Thread類

​ 繼承Thread必須重寫run方法,(具體業務執行方法,需要執行的業務方法,定義在此方法中),註意此方法是線程啟動後線程自動調用的

案例

public class MyThread extends Thread{

    @Override
    public void run() {
        //線程執行的業務方法
        System.out.println("子線程執行");
        for (int i = 0;i < 5;i++){
            System.out.println("--- 線程名---:"+Thread.currentThread().getName()+",序號:"+i);
        }
    }

    public static void main(String[] args) {
        //主線程
        System.out.println("***主線程執行***");
        System.out.println("***線程名***:"+Thread.currentThread().getName());

        //創建一個線程並啟動,只能通過主線程創建其他線程
        MyThread thread1 = new MyThread();
        MyThread thread2 = new MyThread();

        //啟動線程:start()方法(一旦啟動,自動啟動子線程,當前線程繼續向下執行,不會等子線程)
        thread1.start();

        //啟動多線程
        //多線程併發執行:不是正真一樣上的並行執行(肉眼感官是並行),而是通過cpu的調度演算法,有序cpu執行極快,所以肉眼看起來是並行的;
        thread2.start();

        //調用run方法,不可以啟動線程,就是對象的普通方法調用,等run方法執行結束,主線程才能繼續執行
        //thread1.run();

        System.out.println("----主線程執行結束----");

    }
}

運行結果

***主線程執行***
***線程名***:main
----主線程執行結束----
子線程執行
--- 線程名---:Thread-0,序號:0
--- 線程名---:Thread-0,序號:1
--- 線程名---:Thread-0,序號:2
--- 線程名---:Thread-0,序號:3
--- 線程名---:Thread-0,序號:4
子線程執行
--- 線程名---:Thread-1,序號:0
--- 線程名---:Thread-1,序號:1
--- 線程名---:Thread-1,序號:2
--- 線程名---:Thread-1,序號:3
--- 線程名---:Thread-1,序號:4

註意start()方法和run()方法的區別

start():啟動線程start()方法(一旦啟動,自動啟動子線程,當前線程繼續向下執行,不會等子線程);
run() :調用run方法,不可以啟動線程,就是對象的普通方法調用,等run方法執行結束,主線程才能繼續執行

2、實現Runnable介面

必須實現run方法;

案例

public class MyRunnable implements Runnable{

    private int num = 5;

    @Override
    public void run() {
        //線程執行的業務方法
        System.out.println("子線程執行");
        for (int i = 0;i < 5 ;i++){
            if(num>0){
                System.out.println("--- 線程名---:"+Thread.currentThread().getName()+",序號:"+num--);
            }
        }
    }

    public static void main(String[] args) {
        //主線程
        System.out.println("***主線程執行***");
        System.out.println("***線程名***:"+Thread.currentThread().getName());

        //創建一個子線程,並啟動
        MyRunnable runnable1 = new MyRunnable();

        //實現Runnable介面方式創建的線程,不能自己啟動,只能通過Thread類,將Runnable作為參數傳入Thread類的構造方法中,
        // 構造線程對象,才可以啟動
        Thread thread1 = new Thread(runnable1);
        thread1.start();
        //創建多線程 (如果傳入的Runnable參數一樣,可以共用資源)
        Thread thread2 = new Thread(runnable1);
        thread2.start();

        System.out.println("----主線程執行結束----");

    }

}

運行結果

***主線程執行***
***線程名***:main
----主線程執行結束----
子線程執行
子線程執行
--- 線程名---:Thread-0,序號:5
--- 線程名---:Thread-1,序號:4
--- 線程名---:Thread-0,序號:3
--- 線程名---:Thread-1,序號:2
--- 線程名---:Thread-0,序號:1

註意

如果傳入的Runnable參數一樣,可以共用資源

3、比較兩種創建線程的方式

繼承Thread類

  • 編寫簡單,可直接操作線程
  • 適用於單繼承

實現Runnable介面

  • 避免單繼承局限性
  • 便於共用資源

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1. 演示數據 本文的所有演示數據,均是基於下方的四張表。下麵這四張表大家應該不陌生,這就是網傳50道經典MySQL面試題中使用到的幾張原表。關於下方各表之間的關聯關係,我就不給大家說明瞭,仔細觀察欄位名,應該就可以發現。 2. pandasql的使用 1)簡介 pandas中的DataFrame是 ...
  • 前言 Python是一種通用的高級編程語言。用它可以做許多事,比如開發桌面 GUI 應用程式、網站和 Web 應用程式等。 作為一種高級編程語言,Python 還可以讓你通過處理常見的編程任務來專註應用程式的核心功能。並且,編程語言的簡單語法規 則進一步簡化了代碼庫的可讀性和應用程式的可維護性。 與 ...
  • 作者:孫浩 來源:https://xiaomi-info.github.io/2020/03/02/rpc-achieve/ 引言 本文主要論述的是“RPC 實現原理”,那麼首先明確一個問題什麼是 RPC 呢?RPC 是 Remote Procedure Call 的縮寫,即,遠程過程調用。RPC ...
  • 大佬的理解->Jaca多線程(一)多線程基礎 1、線程狀態關係 2、線程的狀態分析 線程的五種狀態:創建-就緒-運行-阻塞-死亡 1.創建狀態 創建線程對象之後,尚未調用其start方法之前; 2.可運行狀態:就緒和運行 1)當調用start()方法啟動線程之後,如果cup沒有給當前線程分配資源,當 ...
  • 首先澄清一下,我用Python收集這些視頻,絕不是想做別的什麼,真的只是用來做動態壁紙,大家不要誤會!我不是那樣的人~ 這樣的不過份吧 😻 閱讀本文你需要準備 1、環境 Python pycharm # 我還給大家準備了大量的學習資料和教程,都在這個群了 # Python學習交流群 2791998 ...
  • Hi,我是Mic 一個工作了4年的粉絲,在面試的時候遇到一個這樣的問題。 “介紹一下Spring IOC的工作流程” 他說回答得不是很好,希望我能幫他梳理一下。 關於這個問題,我們來看看普通人和高手的回答。 普通人: 嗯。。。。。。。。 高手: 好的,這個問題我會從幾個方面來回答。 IOC是什麼 B ...
  • 前言 大家好,歡迎來到 Crossin的編程教室 ! 今天給大家分享的這個案例是用 Python+OpenCV 實現了自動掃雷,並突破了人類的世界記錄。(當然 這不算哈) 咱們廢話不多說,先看成果~ 中級 - 0.74秒 3BV/S=60.81 相信許多人很早就知道有掃雷這麼一款經典的游(顯卡測試) ...
  • 此問題是無法做到100%場景一致性的,只能做到基本一致或者最終一致性。 推薦使用的方案 延時雙刪 原理:先進行緩存清除,再執行update,最後(延遲N秒)再執行緩存清除。(延遲N秒)的時間要大於一次寫操作的時間。 一般執行流程: 服務節點刪除 redis 主庫數據。 服務節點修改 mysql 主庫 ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...