JUC前置知識

来源:https://www.cnblogs.com/changming06/archive/2023/10/23/17783710.html
-Advertisement-
Play Games

JUC前置知識 JUC概述 在開發語言中,線程部分是重點,JUC是關於線程的。JUC是java.util.concurrent工具包的簡稱。這是一個處理線程的工具包,JDK1.5開始出現的。 線程和進程 線程和進程的概念 進程(process): 是電腦的程式關於某數據集合上的一次允許活動,是操作 ...


JUC前置知識

JUC概述

在開發語言中,線程部分是重點,JUC是關於線程的。JUC是java.util.concurrent工具包的簡稱。這是一個處理線程的工具包,JDK1.5開始出現的。

線程和進程

線程和進程的概念
進程(process): 是電腦的程式關於某數據集合上的一次允許活動,是操作系統進行資源分配和任務調度的最小單位,是操作系統的基礎。在當代面向線程設計的電腦結構中,進程是線程的容器。程式是指令,數據及其組織形式的描述,進程是程式的實體。
線程(thread): 是操作系統或CPU核心能夠進行調度的最小單位。被包含在進程中,是進程中的實際運行單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以有多個線程,每個線程執行不同的任務。

總結

進程,是在系統中正在運行的一個應用程式,程式一旦運行就是進程,也是操作系統資源分配的最小單位。
線程,是CPU(Central Processing Unit縮寫)核心(現代電腦的CPU可以有多個CPU核心,俗稱的4核,8核等)進行資源調度的最小單位,或者說進程內獨立執行的一個執行流單元,也是程式執行的最小單位。

線程的狀態

線程狀態類
public enum State {
        /**
         * Thread state for a thread which has not yet started.
         */
     	//新建
        NEW,

        /**
         * Thread state for a runnable thread.  A thread in the runnable
         * state is executing in the Java virtual machine but it may
         * be waiting for other resources from the operating system
         * such as processor.
         */
     	//準備就緒,可以運行
        RUNNABLE,

        /**
         * Thread state for a thread blocked waiting for a monitor lock.
         * A thread in the blocked state is waiting for a monitor lock
         * to enter a synchronized block/method or
         * reenter a synchronized block/method after calling
         * {@link Object#wait() Object.wait}.
         */
     	//阻塞
        BLOCKED,

        /**
         * Thread state for a waiting thread.
         * A thread is in the waiting state due to calling one of the
         * following methods:
         * <ul>
         *   <li>{@link Object#wait() Object.wait} with no timeout</li>
         *   <li>{@link #join() Thread.join} with no timeout</li>
         *   <li>{@link LockSupport#park() LockSupport.park}</li>
         * </ul>
         *
         * <p>A thread in the waiting state is waiting for another thread to
         * perform a particular action.
         *
         * For example, a thread that has called <tt>Object.wait()</tt>
         * on an object is waiting for another thread to call
         * <tt>Object.notify()</tt> or <tt>Object.notifyAll()</tt> on
         * that object. A thread that has called <tt>Thread.join()</tt>
         * is waiting for a specified thread to terminate.
         */
     	//等待,不見不散
        WAITING,

        /**
         * Thread state for a waiting thread with a specified waiting time.
         * A thread is in the timed waiting state due to calling one of
         * the following methods with a specified positive waiting time:
         * <ul>
         *   <li>{@link #sleep Thread.sleep}</li>
         *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
         *   <li>{@link #join(long) Thread.join} with timeout</li>
         *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
         *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
         * </ul>
         */
     	//定時等待,過時不候
        TIMED_WAITING,

        /**
         * Thread state for a terminated thread.
         * The thread has completed execution.
         */
     	//停止,終止
        TERMINATED;
    }

wait和sleep方法的區別

  • 1.sleep是Thread類的靜態方法,wait是Object類的方法,任何對象實例都能調用。
  • 2.sleep不會釋放鎖,也不需要占有鎖。wait會釋放鎖,但釋放鎖這個動作的前提是,當前線程占有鎖。
  • 3.這兩個方法都可以被interrupted方法中斷。
  • 4.這兩個方法還有個特點,就是線程在哪裡被阻塞,就在哪裡被喚醒。
串列,並行和併發
串列模式

串列表示所有任務一一按先後順序進行。串列意味著必須先裝完一車柴才能運送這車柴,只有運送到了,才能卸下這車柴,並且只有完成了這三個步驟,才能進行下一步驟。串列是一次只能取得一個任務,並執行這個任務。

並行模式

並行意味著可以同時取得多個任務,,並同時去執行所取得的這些任務。並行模式相當於將長長的一條隊列,劃分成了多條短隊列,所以並行縮短了任務隊列的長度。並行的效率從代碼層次上,強依賴於多進程/多線程代碼,從硬體角度上依賴於多核CPU。

併發

指的是多個程式可以同時運行的現象,更細化的是多進程可以同時運行或者多指令可以同時運行。
併發的重點是一種現象,描述的是多進程同時運行的現象。但實際上,一個CPU同時,只能運行一個線程。所以同時運行,不是同一時刻有多個線程運行的現象,而是提供一種功能,讓用戶看起來多個程式同時運行了,但是實際上的線程不是一直霸占CPU的,而是執行一會停,一會執行。
要解決大併發問題,通常是將大任務分解成多個小任務,由於OS(Operating System)對進程的調度是隨機的,所以切分成多個小任務後,可能會從任一小任務出執行。可能出現的問題,一個小任務執行了多次,還沒開始下個任務。這時一般會採用隊列或類似數據結構來存放各個小任務的成果。可能出現還沒準備好第一步,就執行第二步的可能。這時,一般採用多路復用或非同步的方式,比如只有準備好了,才產生事件執行下一步任務。可以多進程/多線程的方式並行執行這些小任務。也可以單進程/單線程執行這些小任務,這是很可能要配合多路復用才能達到較高的效率。

小結

併發:同一時刻多個線程在訪問同一資源,多個線程對一個點。如春運搶票,電商秒殺。
並行:多項工作一起執行,之後再彙總。如泡泡麵,水壺燒水,一邊放調料。

管程

管程又叫Monitor(監視器),在OS中叫管程/Monitor(監視器),在Java中叫鎖(Lock)。
鎖其實是一種同步機制,保證同一時間內,只能有一個線程訪問受保護的資源。
在JVM中實現這個鎖機制(同步機制),是通過進入,退出管程對象實現的,也就是常說的持有鎖,和釋放鎖。進入管程(擁有鎖),退出管程(釋放鎖)。一個線程持有該鎖,就只有當前線程可以訪問,該鎖保護的資源。釋放鎖,就是當前線程不訪問,該鎖保護的資源了,其他線程可以競爭該鎖,誰獲取到鎖,可以訪問鎖保護的線程。

用戶線程和守護線程

daemon n.守護神
用戶線程和守護線程,是jvm中的概念。
用戶線程,顧名思義,用戶自定義的線程。主線程結束,用戶線程還在運行,jvm存活。
守護線程 ,用於守護用戶線程,執行的線程如垃圾回收(gc)。沒有用戶線程,都是守護線程的化話,主線程結束,jvm結束。設置一個線程為守護線程,必須在開啟這個線程之前。

public class Main {
    public static void main(String[] args) {
        Thread thread = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "\t" + Thread.currentThread().isDaemon());// aa true
            while(true){

            }
        },"aa");
        thread.setDaemon(true);//通過該方法可將線程設置為守護線程
        thread.start();

        System.out.println(Thread.currentThread().getName() + "over");// mainover
    }
}

只是為了記錄自己的學習歷程,且本人水平有限,不對之處,請指正。


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

-Advertisement-
Play Games
更多相關文章
  • HDFS文件系統基本信息 HDFS作為分散式存儲的文件系統,有其對數據的路徑表達方式。 HDFS同Linux系統一樣,均是以/作為根目錄的組織形式 Linux: /usr/local/hello.txt HDFS: /usr/local/hello.txt 命令行 # 老版本用法 hadoop fs ...
  • 作者:WangMin 格言:努力做好自己喜歡的每一件事 作為前端開發來說,要掌握的CSS基礎一定很多,那麼CSS中盒子模型肯定是必考必問必掌握的前端知識點,因為它是CSS基礎中非常重要的內容,接下來我們就一起來瞭解一下盒子模型吧! 什麼是盒子模型? CSS 所有的HTML 標簽元素在網頁中都生成了一 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 頁面效果 具體實現 新增 1、監聽滑鼠抬起事件,通過window.getSelection()方法獲取滑鼠用戶選擇的文本範圍或游標的當前位置。 2、通過 選中的文字長度是否大於0或window.getSelection().isColla ...
  • 開發過程中經常遇到支付寶小程式跳轉的問題,這裡總結一下支付寶小程式跳轉的常見場景和方式,希望可以對大家有所幫助。 話不多說,上乾貨! 支付寶小程式跳轉的三種行為 支付寶小程式跳轉可以拆分為三種行為,即: 外部跳轉支付寶小程式 支付寶小程式內部頁面之間跳轉 支付寶小程式內部跳轉到外部 一、外部跳轉小程 ...
  • 飛碼是京東科技研發的低代碼產品,可使營銷運營域下web頁面快速搭建。飛碼是單web頁面搭建工具,從創建頁面到監測再到投產的一站式解決方案 ...
  • 接上一節:從零用VitePress搭建博客教程(5) - 如何自定義頁面模板、給頁面添加獨有的className和使頁面標題變成側邊目錄? 九、第三方組件庫的使用 我們經常看見UI組件庫的文檔,這裡我們就用element-plus第三方組件庫為例子,搭建組件庫文檔 examples:作為組件庫示例目 ...
  • Hope is a good thing, maybe the best of things, and no good thing ever dies. 希望是件美麗的東西,也許是最好的東西,而美好的東西是永遠不會消逝的。 大家好,我是勇哥 。 1024 , 程式員節,圓了我一個小小的夢。 花了半年 ...
  • 1 我的高價位同事 我有個互聯網前同事快40了,之前35k,裁員後找了很久工作。最後18k入職一家公司繼續乾。只要降低預期就行了。8k不行就4k,4k不行就1k。那樣了是不是還不如開滴滴、送外賣、做物流。那樣多數人會選擇開滴滴去單的。熬吧,人口今年開始負增長了。捲王,工賊,潤的潤,捲的捲,都是個人選 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...