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

来源: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
  • Timer是什麼 Timer 是一種用於創建定期粒度行為的機制。 與標準的 .NET System.Threading.Timer 類相似,Orleans 的 Timer 允許在一段時間後執行特定的操作,或者在特定的時間間隔內重覆執行操作。 它在分散式系統中具有重要作用,特別是在處理需要周期性執行的 ...
  • 前言 相信很多做WPF開發的小伙伴都遇到過表格類的需求,雖然現有的Grid控制項也能實現,但是使用起來的體驗感並不好,比如要實現一個Excel中的表格效果,估計你能想到的第一個方法就是套Border控制項,用這種方法你需要控制每個Border的邊框,並且在一堆Bordr中找到Grid.Row,Grid. ...
  • .NET C#程式啟動閃退,目錄導致的問題 這是第2次踩這個坑了,很小的編程細節,容易忽略,所以寫個博客,分享給大家。 1.第一次坑:是windows 系統把程式運行成服務,找不到配置文件,原因是以服務運行它的工作目錄是在C:\Windows\System32 2.本次坑:WPF桌面程式通過註冊表設 ...
  • 在分散式系統中,數據的持久化是至關重要的一環。 Orleans 7 引入了強大的持久化功能,使得在分散式環境下管理數據變得更加輕鬆和可靠。 本文將介紹什麼是 Orleans 7 的持久化,如何設置它以及相應的代碼示例。 什麼是 Orleans 7 的持久化? Orleans 7 的持久化是指將 Or ...
  • 前言 .NET Feature Management 是一個用於管理應用程式功能的庫,它可以幫助開發人員在應用程式中輕鬆地添加、移除和管理功能。使用 Feature Management,開發人員可以根據不同用戶、環境或其他條件來動態地控制應用程式中的功能。這使得開發人員可以更靈活地管理應用程式的功 ...
  • 在 WPF 應用程式中,拖放操作是實現用戶交互的重要組成部分。通過拖放操作,用戶可以輕鬆地將數據從一個位置移動到另一個位置,或者將控制項從一個容器移動到另一個容器。然而,WPF 中預設的拖放操作可能並不是那麼好用。為瞭解決這個問題,我們可以自定義一個 Panel 來實現更簡單的拖拽操作。 自定義 Pa ...
  • 在實際使用中,由於涉及到不同編程語言之間互相調用,導致C++ 中的OpenCV與C#中的OpenCvSharp 圖像數據在不同編程語言之間難以有效傳遞。在本文中我們將結合OpenCvSharp源碼實現原理,探究兩種數據之間的通信方式。 ...
  • 一、前言 這是一篇搭建許可權管理系統的系列文章。 隨著網路的發展,信息安全對應任何企業來說都越發的重要,而本系列文章將和大家一起一步一步搭建一個全新的許可權管理系統。 說明:由於搭建一個全新的項目過於繁瑣,所有作者將挑選核心代碼和核心思路進行分享。 二、技術選擇 三、開始設計 1、自主搭建vue前端和. ...
  • Csharper中的表達式樹 這節課來瞭解一下表示式樹是什麼? 在C#中,表達式樹是一種數據結構,它可以表示一些代碼塊,如Lambda表達式或查詢表達式。表達式樹使你能夠查看和操作數據,就像你可以查看和操作代碼一樣。它們通常用於創建動態查詢和解析表達式。 一、認識表達式樹 為什麼要這樣說?它和委托有 ...
  • 在使用Django等框架來操作MySQL時,實際上底層還是通過Python來操作的,首先需要安裝一個驅動程式,在Python3中,驅動程式有多種選擇,比如有pymysql以及mysqlclient等。使用pip命令安裝mysqlclient失敗應如何解決? 安裝的python版本說明 機器同時安裝了 ...