Android Thread 官方說明

来源:https://www.cnblogs.com/elvischiu/archive/2018/05/01/8976234.html
-Advertisement-
Play Games

Thread官方說明 https://developer.android.google.cn/reference/java/lang/Thread Thread是程式中執行的線程。Java虛擬機允許應用程式同時運行多個執行線程。 每個線程都可設置優先順序別。優先順序別高的線程優先於優先順序別低的線程執行。 ...


Thread官方說明

https://developer.android.google.cn/reference/java/lang/Thread

Thread是程式中執行的線程。Java虛擬機允許應用程式同時運行多個執行線程。


每個線程都可設置優先順序別。優先順序別高的線程優先於優先順序別低的線程執行。線程可能是守護進程(Daemon),也可能是非守護進程(Non-daemon)。當在某個線程的代碼中創建一個新的Thread對象時,新線程的優先順序初始設置等於創建線程的優先順序,並且當且僅當創建線程是守護進程時新的Thread才是守護進程線程。


當Java虛擬機啟動時,通常會有一個非守護線程(通常會調用某個指定類的main方法)。Java虛擬機將繼續執行線程,直到出現以下任一情況:

  • Runtime類的exit方法已經被調用並且安全管理器允許退出操作發生。
  • 所有非守護線程已經退出,或者通過調用run方法返回或通過拋出一個run方法的異常。

 

有兩種方法可以創建一個新的執行線程。一種是將一個類聲明為Thread的子類。這個子類應該重寫Thread類的run方法。然後可以分配和啟動子類的一個實例。例如,計算大於某個值的素數的線程:

 

class PrimeThread extends Thread {
    long minPrime;
    PrimeThread(long minPrime) {
        this.minPrime = minPrime;
    }

    public void run() {
        // compute primes larger than minPrime
         . . .
    }
}

 

下麵的代碼會創建一個線程並執行:

PrimeThread p = new PrimeThread(143);
p.start();

 

另一種創建線程的方式是聲明一個實現了Runnable介面的類,然後實現了run方法。 然後可以分配一個類的實例,在創建線程時作為參數傳遞,然後啟動線程。 示例如下:

class PrimeRun implements Runnable {
    long minPrime;
    PrimeRun(long minPrime) {
        this.minPrime = minPrime;
    }

    public void run() {
        // compute primes larger than minPrime
        . . .
    }
}

 

下麵的代碼會創建一個線程並開始執行:

PrimeRun p = new PrimeRun(143);
new Thread(p).start();

 

每個線程都有一個用於標識的名稱。 多個線程可能具有相同的名稱。 如果在創建線程時未指定名稱,則系統會自動為其生成新名稱。除非另有說明,否則將null參數傳遞給此類中的構造函數或方法將導致拋出NullPointerException。

守護線程(daemon)和用戶線程(User Thread)

所謂守護線程就是運行在程式後臺的線程,程式的主線程Main(比方java程式一開始啟動時創建的那個線程)不會是守護線程 。Daemon thread在Java裡面的定義是,如果虛擬機中只有Daemon thread 在運行,則虛擬機退出。通常Daemon線程用來為User線程提供某些服務。程式的main()方法線程是一個User線程,User線程創建的線程為User線程。當所有的Non-daemon線程結束後,JVM才會結束。

 

通過在一個線程對象上調用setDaemon(true),可以將user線程創建的線程明確地設置成Daemon線程。例如,時鐘處理線程、idle線程、垃圾回收線程、屏幕更新線程等,都是Daemon線程。通常新創建的線程會從創建它的線程哪裡繼承daemon狀態,除非明確地線上程對象上調用setDaemon方法來改變daemon狀態。


需要註意的是,setDaemon()方法必須在調用線程的start()方法之前調用。一旦一個線程開始執行(如,調用了start()方法),它的daemon狀態不能再修改。通過方法isDaemon()可以知道一個線程是否Daemon線程。


總之,必須等所有的Non-daemon線程都運行結束了,只剩下daemon的時候,JVM才會停下來,註意Main主程式是Non-daemon線程,預設產生的線程全部是Non-daemon線程。


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

-Advertisement-
Play Games
更多相關文章
  • 連接查詢:同時設計兩個及以上的表的查詢 連接條件或連接謂詞:用來連接兩個表的條件一般格式: [<表名1>]<列名1> <比較運算符> [<表名2>]<列名2> [<表名1>]<列名1> between [<表名2>]<列名2> and [<表名2>]<列名3> 等值連接: 連接運算符為= 查詢每個學 ...
  • linux上安裝redis,本地遠程訪問問題總結,redis超時連接問題 ...
  • MongoDB運行的兩種方式 檢查是否有MongoDB:which mongod 創建資料庫存儲目錄:mkdir -p /data/db 檢查磁碟目錄是否有空間(一般要大於4G):df -lh 啟動:a直接啟動:mongod --dbpath=/data/db --port=27017 b守護進程的 ...
  • 對oracle資料庫,PL/SQL用法的快速學習 ...
  • 一、超級管理員創建及開啟登錄驗證 如果MongoDB要開啟登錄驗證,必須在開啟登錄驗證之前先創建好超級管理員,否則無法登錄資料庫! 例如,創建一個超級管理員admin,關聯給admin資料庫,角色設置為root(超級管理員) 首先,進入到目標庫admin,use admin 然後,輸入指令 db.c ...
  • 在Android開發過程中,耗時操作是不允許寫在主線程(UI線程)中的,以免由於等待時間過長而發生ANR。所以耗時操作需要創建子線程來完成,然而往往這些操作都需要與主線程進行通訊交互(例如更新主線程的UI),但android規定除了UI線程外,其他線程都不可以對UI控制項進行訪問或操控,所以我們需要通 ...
  • 上一篇主要分析了Robust的使用方法,這一篇就來總結一下Robust的源碼分析。 我個人傾向於將Robust框架分為兩個部分,自動插入代碼和動態載入Patch。 一、Robust源碼分析 目前我的分析將Robust動態載入分為兩個部分,一部分是插樁後的代碼邏輯,一部分是拉取Patch的邏輯。 我們 ...
  • onInterceptTouchEvent就是對子控制項中Viewpager的處理:左右滑動應該讓viewpager消費 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...