欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java深入淺出講解多線程的概念到使用

 更新時間:2022年05月20日 09:14:23   作者:orangemilk_  
哈哈!經過一個階段的學習,Java基礎知識學習終于到多線程了!Java多線程以及后面互斥鎖的概念都是Java基礎學習的難點,所以我做了一個總結,希望對大家也有幫助

下面開始學習Java多線程吧!

寫在前面:Java系統(tǒng)在語言層次上對多線程直接提供支持,多線程的主要目的是將一個程序中的各個程序段并發(fā)化,在在通常情況下,Java程序各部分是按順序一次執(zhí)行的,由于某種原因,需要將這些按順序執(zhí)行的程序段轉化為并發(fā)執(zhí)行,每個程序段在邏輯上是相互完整的代碼段。實際上,在單處理器上,同一時刻只能執(zhí)行一個代碼,但是在同一時間段內,這些代碼交替執(zhí)行,所謂的“微觀串行,宏觀并行”。

1.線程的幾個相關概念

多線程編程的含義就是將一個程序任務分為幾個可以同時并發(fā)執(zhí)行的子任務。

程序:程序是含有指令和數據的文件,也可以說程序是靜態(tài)代碼,被存儲在磁盤或者其他的數據存儲設備中。

進程:進程是程序執(zhí)行一次的過程。進程是系統(tǒng)運行程序的單位,因此進程是動態(tài)的。當程序運行時就會被系統(tǒng)載入內存,并且啟動他的工作。對于完全不相關的程序,在同時執(zhí)行時,不會做數據的交換,而且可以完全獨立運行。

多任務:多任務是在一個系統(tǒng)中可以同時運行多個進程。每個進程都是獨立的任務,每個進程都有自己獨立的內存。所謂的同時運行進程,其實是操作系統(tǒng)將資源分配給各個進程以后,每個進程在CPU上交替運行。

線程:線程是比進程更小的執(zhí)行單位。一個進程執(zhí)行過程可以產生多個線程,形成多條執(zhí)行路徑,提高了運行效率。不同的是,同類的多個線程共享同一塊內存,在進行各個線程的切換時開銷比進程小很多。

多線程:同時執(zhí)行一個以上的線程,一個線程的執(zhí)行不必等到另一個線程執(zhí)行完成在執(zhí)行。

2.線程的狀態(tài)與生命周期

每個Java程序都有一個默認的主線程,對于應用程序來說其主線程就是main()方法執(zhí)行的線程。要想實現多線程,必須在主線程中創(chuàng)建新的線程對象,Java語言使用Thread類及其子類的對象來表示線程,新線程的建立在它完整的生命周期中通常要經歷五種狀態(tài),通過線程的控制和調度可以實現這幾種狀態(tài)之間的轉化。

1. 新建狀態(tài):線程對象聲明和創(chuàng)建,未被執(zhí)行之前。

2. 就緒狀態(tài):處于新建狀態(tài)的線程被啟動后進入線程隊列排隊等待CPU時間片。

3. 運行狀態(tài):就緒狀態(tài)的線程被調度并獲得CPU資源。

4. 阻塞狀態(tài):在特殊情況下讓出CPU資源暫時中止自己的執(zhí)行。

5. 消亡狀態(tài):線程執(zhí)行完成或者程序停止運行。

3.線程的優(yōu)先級與調度

在多線程系統(tǒng)中,每個線程都會被賦予一個優(yōu)先級。優(yōu)先級高的線程可以在一段時間內獲得比優(yōu)先級低的線程更多的執(zhí)行時間。優(yōu)先級相同時先來先用。

創(chuàng)建一個新的線程的優(yōu)先級規(guī)則:

  • 新建線程的優(yōu)先級繼承創(chuàng)建它的父線程的優(yōu)先級,父線程是指創(chuàng)建新線程對象語句所在的線程。
  • 一般情況下,主線程具有普通優(yōu)先級,優(yōu)先級從低到高用1-10來表示。

4.Java中多線程的創(chuàng)建

4.1繼承Thread類創(chuàng)建線程

當我們發(fā)現程序可以分頭執(zhí)行時,就可以通過創(chuàng)建多線程分頭工作,在只有一個CPU的情況下,程序運行時間并不會因為采取多線程而減少,但是整體的感覺可能比較好。

Java語言中實現多線程的第一種方法,繼承java.lang包中的Thread類。Java語言中已經定義了Thread類,該類中定義的方法可以實現線程的產生,執(zhí)行,終止與查看進程的執(zhí)行狀態(tài)。

例:利用Thread類的子類創(chuàng)建線程。

class MyThread extends Thread{
    private String who;
    public MyThread(String name){
        who=name;
        }
        public void run(){
        for(int i=0;i<2;i++){
            try{
                sleep((int)(1000*Math.random()));
        }
            catch(InterruptedException e){}
            System.out.println(who+"正在運行...");
        }
        }
        }
        public class A_1{
    public static void main(String[] args){
        MyThread you=new MyThread("你");
        MyThread she=new MyThread("她");
        you.start();
        she.start();
        System.out.println("主方法運行結束");
    }
        }
/**
主方法運行結束
你正在運行...
她正在運行...
你正在運行...
你正在運行...
*/

語法:

class 類名 extends Thread{
    類中的成員變量;
    類中的成員方法;
    修飾符 run(){
        線程代碼;
    }
}

4.2實現Runnable接口創(chuàng)建線程

由于Java不支持多重繼承,如果某個類已經繼承了其它的父類,將無法通過繼承Thread類來創(chuàng)建線程。于是出現了Java中實現多線程的第二種方法,也是比較常用的一種方法,通過實現Runnable接口創(chuàng)建線程,這種方法可以使線程具有其它類的一些特征,極具靈活性。

例:利用Runnable接口創(chuàng)建線程。

class MyThread extends Thread{
    private String who;
    public MyThread(String name){
        who=name;
        }
        public void run(){
        for(int i=0;i<2;i++){
            try{
                sleep((int)(1000*Math.random()));
        }
            catch(InterruptedException e){}
            System.out.println(who+"正在運行...");
        }
        }
        }
        public class A_1{
    public static void main(String[] args){
        MyThread you=new MyThread("你");
        MyThread she=new MyThread("她");
        you.start();
        she.start();
        System.out.println("主方法運行結束");
    }
        }
/**
主方法運行結束
你正在運行...
她正在運行...
你正在運行...
你正在運行...
*/

Runnable是Java語言實現線程的接口。從本質上說,實現線程的類必須實現該接口。其實Thread就是直接繼承Object類并且實現Runnable接口。

5.多線程的同步控制

當多個線程之間共享數據,若線程還是異步的方式訪問共享數據,有時候是不安全和不符合邏輯的。此時,當一個線程對共享數據進行修改時,在沒有完成相關操作之前,其它線程不能打斷它。否則就會破壞數據的完整性,得到一個錯誤的結果。這就是線程的同步。

線程的同步控制是在數據的共享基礎之上的,是為了解決多個線程共享數據導致的數據不一致問題。在同一時刻只允許一個線程處于操作中,這就是同步控制中的"線程間互斥"。

在并發(fā)程序中,對多線程共享的資源或數據稱為臨界資源,把線程中訪問臨界資源的代碼成為臨界代碼。臨界資源在一個時刻只能被一個線程訪問,而訪問臨界資源的代碼就是臨界代碼。

Java技術用對象"互斥鎖"的機制來實現線程間的互斥操作。

關于互斥鎖的機制下篇文章講解。

6.線程之間的通信

多線程的執(zhí)行往往需要相互之間的配合,為了更加有效的協(xié)調不同線程的工作,需要在線程間建立溝通渠道,通過線程間的對話來解決線程的同步問題,而不僅僅是依靠互斥機制。

Java.lang.Object中的wait()和notify()等方法為線程間的通信提供了有效手段。對于一個線程,若基于對象x調用wait()方法或notify()方法,該線程必須已經獲得對象x的互斥鎖。也就是說,wait()和notify()只能在同步代碼里調用。

sleep()和wait()方法都能使線程堵塞,區(qū)別是:wait()方法在放棄CPU資源的同時交出了資源控制權,而sleep()方法無法做到。

到此這篇關于Java深入淺出講解多線程的概念到使用的文章就介紹到這了,更多相關Java多線程內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java實現花卉管理系統(tǒng)

    Java實現花卉管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現花卉管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • 詳解Spring AOP 實現“切面式”valid校驗

    詳解Spring AOP 實現“切面式”valid校驗

    本篇文章主要介紹了詳解Spring AOP 實現“切面式”valid校驗,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Java實戰(zhàn)寵物醫(yī)院預約掛號系統(tǒng)的實現流程

    Java實戰(zhàn)寵物醫(yī)院預約掛號系統(tǒng)的實現流程

    只學書上的理論是遠遠不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+JSP+Spring+SpringBoot+MyBatis+html+layui+maven+Mysql實現一個寵物醫(yī)院預約掛號系統(tǒng),大家可以在過程中查缺補漏,提升水平
    2022-01-01
  • Windows系統(tǒng)安裝JDK小結

    Windows系統(tǒng)安裝JDK小結

    這篇文章主要給大家詳細介紹了Windows系統(tǒng)安裝JDK的方法和步奏,十分的細致,有需要的小伙伴可以參考下
    2016-03-03
  • Java Proxy機制詳細解讀

    Java Proxy機制詳細解讀

    這篇文章主要介紹了Java Proxy機制詳細解讀,還是非常不錯的,這里分享給大家,需要的朋友可以參考下。
    2017-10-10
  • SpringBoot中的YAML配置文件和日志詳解

    SpringBoot中的YAML配置文件和日志詳解

    這篇文章主要介紹了SpringBoot中的YAML配置文件和日志的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-12-12
  • java利用數組求平均值,最大值,最小值

    java利用數組求平均值,最大值,最小值

    java利用數組求平均值,最大值,最小值。需要的朋友可以過來參考下,希望對大家有所幫助
    2013-10-10
  • 淺析Java ClassName.this中類名.this關鍵字的理解

    淺析Java ClassName.this中類名.this關鍵字的理解

    Java ClassName.this中類名.this關鍵字 的理解大家都了解多少,有不太了解的朋友可以參考下本文一起學習學習
    2016-05-05
  • Java自定義長度可變數組的操作

    Java自定義長度可變數組的操作

    這篇文章主要介紹了Java自定義長度可變數組的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java 8 引入lambda表達式的原因解析

    Java 8 引入lambda表達式的原因解析

    這篇文章主要介紹了Java 8 引入lambda表達式的原因解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08

最新評論