線程實現方式。

来源:https://www.cnblogs.com/zhangyuhao/archive/2019/04/30/10770294.html
-Advertisement-
Play Games

併發與並行: 併發:多個任務交替執行 (一個人吃兩個饅頭,兩個交替啃) 並行:同時執行。(n個人吃n個饅頭) 速度快些。 線程與進程: 進程:進入到記憶體中的程式叫進程。 線程: 主線程: 執行主方法(main)的線程 單線程程式:Java程式中只有一個線程,從main方法開始,從上到下依次執行。 J ...


併發與並行:

併發:多個任務交替執行 (一個人吃兩個饅頭,兩個交替啃)

並行:同時執行。(n個人吃n個饅頭)  速度快些。

線程與進程:

進程:進入到記憶體中的程式叫進程。

線程:

 主線程:

執行主方法(main)的線程

單線程程式:Java程式中只有一個線程,從main方法開始,從上到下依次執行。

JVM執行main方法,main方法會進入棧記憶體,

然後JVM找到操作系統開闢一條main方法通向cpu的執行路徑,

cpu就可以通過這個路徑執行main方法,這個路徑叫main(主)線程。

多線程:

java程式屬於搶占式調度,哪個線程高,哪個線程就優先執行,同一級別隨機執行。

創建多線程程式的第一種方式:

java.lang.Thread 類:是描述線程的類,想實現多線程程式,就必須繼承該類。

實現步驟: 

  1、創建Thread類的子類。

  2、子類重寫run方法, 來設置線程任務。

  3、創建子類對象,調用start()方法,開啟新的線程,執行run方法。

  結果是:兩個線程併發執行。

public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i=0;i<3;i++){
            System.out.println("run->"+i);
        }
    }
}
public class ThreadDemo {
    public static void main(String[] args) {
        MyThread myThread=new MyThread();
        myThread.start();
        for (int i=0;i<3;i++){
            System.out.println("main->"+i);
        }
    main->0
    run->0
    main->1
    run->1
    main->2
    run->2 } }

多線程運行原理:

new MyThread的時候,又開闢了一條通向cpu的新路徑,來執行run方法。

此時,對cpu而言,就有了兩條執行路徑。

main線程和新線程一起搶奪cpu的執行權。

多線程記憶體分析:

開始執行程式時,開闢一塊棧記憶體,main方法入棧。

此時,如果直接調用run方法的話,也是在這塊棧記憶體執行run(),也就是仍然

是main線程程式(單線程)程式。

而如果調用的是start(),會另外開闢一塊棧空間,run()入棧執行。

Thread類的常用方法:

獲取線程名稱:

  1、Thread類的方法,getName();

  2、獲取當前正在執行的線程 static Thread currentThead(),然後用getName();

第一種:

public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println(getName());
        }
    }
public static void main(String[] args) {
        new MyThread().start();
        new MyThread().start();
        //Thread-0
       // Thread-1
    }

第二種:

public static void main(String[] args) {
        System.out.println(Thread.currentThread().getName());
        //main
    }
}

設置線程名稱:

  1、void setName(String name) 2、設置帶參構造函數

sleep方法:

  public static void sleep(Long ...) :使當前正在執行的線程以指定毫秒暫停。

 public static void main(String[] args) {
       for (int i=0;i<5;i++){
           System.out.println(i);
           try {
               Thread.sleep(1000);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }
       }
    }

創建多線程程式的第二種方式:

實現Runnable介面:

java.lang.Runnable.   實現類必須定義run的無參方法。

java.lang.Thread 類的構造方法:

  1、Thread(Runnable target) 分配新的Thread對象。

  2、Thread(Runnable target,String name)。

實現步驟:

  1、創建Runnable介面的實現類。

  2、重寫run方法,設置線程任務。

  3、創建實現類的對象,用含有Runnable介面的構造函數創建Thread類對象。

  4、用start方法,開啟新線程執行run();

public class RunnableClass implements Runnable {
    @Override
    public void run() {
        for (int i=0;i<5;i++){
            System.out.println(
                    Thread.currentThread().getName()
                    +"->"+i
            );
        }
    }
}
public static void main(String[] args) {
       RunnableClass runnable=new RunnableClass();
       Thread thread=new Thread(runnable);
       thread.start();
       for (int i=0;i<5;i++){
           System.out.println(
                   Thread.currentThread().getName()
                   +"->"+i
           );
       }
    }

兩種實現多線程方法的區別:

實現Runnable介面實現多線程的好處:

  1、避免單繼承的局限性: 

    繼承了Thread類就不能繼承其他類了,而使用介面的方式還可以繼承其他類。

  2、增強程式的擴展性,降低了程式的耦合性(解耦):

    用實現Runnable介面的方式,把設置線程任務和開啟線程進行分離(解耦 )

匿名內部類實現多線程:

作用:

  簡化代碼,把實現類實現介面,重寫方法,創建實現類方法統一完成。

格式:  new 父類/介面(){重寫方法};

 public static void main(String[] args) {
        new Thread() {
            @Override
            public void run() {
                for (int i=0;i<5;i++){
                    System.out.println(currentThread().getName());
                }
            }
        }.start();
       new Thread(new Runnable() {
           @Override
           public void run() {
               for (int i=0;i<5;i++){
                   System.out.println(Thread.currentThread().getName());
               }
           }
       }).start();
    }

 


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

-Advertisement-
Play Games
更多相關文章
  • 補充上期str尾碼小魔法: .swapcase() 將字元串大小寫互轉,小變大,大變小 .isnumeric() 判斷是否為數字,支持漢字,範圍廣 .isprinttable() 檢測變數中是否有無法顯示的字元,如\n\t存在則返回False .isspace() 判斷是否全部為空格,\t\n也可以 ...
  • 1. 查看Linux 版本 2. 安裝selemium 2.1 通過pip 安裝selenium,先安裝pip: 2.2 如果提示pip更新則執行如下命令: 2.3 pip安裝selenium 2.4 卸載Centos自帶的Mozilla firefox 2.5 下載、解壓firefox 2.6 創 ...
  • Python多繼承MRO 在Python2.1中,採用了經典類,使用深度優先演算法解析。 Python2.2中,引入了新式類,使用深度優先演算法和廣度優先演算法。 在Python2.3以後的版本中,經典類和新式類共存,使用了DFS演算法和C3演算法。 Python2中的經典類 Python3的新式類 C3演算法 ...
  • 題目 "P2711 小行星" 解析 這道題挺巧妙的,乍一看是空間上的,無從下手,稍微轉換一下就可以了。 看到題目,求消除這些行星的最少次數,就是求最小割,也就是求最大流,考慮怎樣建圖。 考慮當我們消去一個面上的所有點時,我們消去這個面後,這個面就不會再被消了, 也就是只能被消一次 ,比如我們消去與$ ...
  • 思路 既然$x$的數量那麼小,我們就可以先把每個$x$搜索一遍。 枚舉x的時候不需要把$a,b,c$全枚舉一遍,只要枚舉其中的兩個就可以枚舉到當前 ...
  • (劍指offer)輸入一個遞增排序的數組和一個數字S,在數組中查找兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 思路:選定第一個數字,然後遍歷後面的數字求和並與S比較,需要n-1次,不行的話再選定第2,3,,,n個數字,需要n^2次,時間複雜度比較高。更簡單的方法 ...
  • day 20 02 模塊的導入 運行結果: 9. 兩種不同導入的優缺點: (1)import demo demo:裡面的名字都會導入 會占很多記憶體 裡面的命名空間和不是模塊裡面的命名空間是分開的,所以外面如果有和demo裡面相同的變數名,也是不會相互影響 (2)from demo import 變數 ...
  • 超級全局變數有9個特點是全局可用!頁面到處都能訪問到這個變數 $_GET獲得的是瀏覽器地址欄過來的數據,或者表單GET方式提交的數據 $_POST獲得的是表單POST方式提交的數據 $_REQUEST預設情況(具體情況要看php.ini的配置)獲得的是既包含POST過來的值,也包含GET方式獲得的值 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...