1. 程式人生 > >Java多執行緒筆記一

Java多執行緒筆記一

之前寫的程式碼都是單執行緒的,只有一個主執行緒,main方法,即一個程式只有一條從頭到尾的執行線索。然而現實世界中的很多過程都具有多條線索同時動作的特性。
java語言的特點是內建了對多執行緒的支援。
每個程序都有一段專用的記憶體區域,執行緒間可以共享相同的記憶體單元(包括程式碼和資料)
並利用這些共享單元來實現資料交換,實時通訊與必要的同步操作。
Java的多執行緒就是在作業系統每次分時給java程式一個時間片的CPU時間內,在若干個獨立的可控制的執行緒之間進行切換。
JVM能夠充分利用這些CPU,使得java程式在同一時刻獲得多個時間片,java程式就可以獲得真實的執行緒併發執行效果。
如果在main方法中建立了其它執行緒,那麼JVM就要在主執行緒和其它執行緒之間輪流切換,以保證每個執行緒都有機會使用cpu資源。
如果main方法中有多個執行緒,jvm要等所有執行緒(主執行緒,和其它執行緒)都結束才能結束java應用程式。

執行緒的狀態及其生命週期
java裡面執行緒實現由兩種方法:
1:繼承Thread類及其子類
2:實現runnable介面
新建的執行緒在完整生命週期裡面有四種狀態
1.新建
(執行緒屬於建立狀態,執行緒擁有了相應的記憶體空間和其它資源)

2.執行
執行緒在建立之後就具備了執行的條件,一旦輪到它來享用cpu資源,即jvm將cpu使用權切換給該程序時,
此執行緒就可以脫離建立它的主執行緒獨立開始自己的生命週期。
執行緒建立後僅僅是佔有了記憶體資源,在JVM管理的執行緒中還沒有這個執行緒,此執行緒必須呼叫start()方法(從父類
那裡繼承的方法)通知jvm,這樣jvm就能知道又有一個新執行緒排隊等候切換了。
當JVM將CPU使用權切換給執行緒時,如果執行緒是Thread的子類建立的,該類中的run方法會立刻執行。所以,必須在子類中重寫父類的run方法,Thread類
的run方法沒有具體的內容,程式需要在thread類的子類中重寫run方法來覆蓋父類的run方法,run方法規定了該執行緒的具體使命。
線上程沒有結束run()方法之前,不要讓執行緒再呼叫start()方法,否則將發生ILLegalThreadStateException異常。

3.中斷
在java中有四種原因的中斷:

1.jvm將cpu資源從當前執行緒切換給其他執行緒,使本執行緒讓出CPU使用權處於中斷狀態

2.執行緒使用cpu資源期間,執行了sleep方法,使當前執行緒進入休眠狀態。sleep方法是thread類的類方法,執行緒一旦執行了sleep(int millsecond)方法,
就會立刻讓出cpu使用權,使當前執行緒處於中斷狀態。經過引數millsecond指定的毫秒數之後,該執行緒會重新進入到執行緒佇列中排隊等待cpu資源,以便從
中斷處繼續執行。

3.執行緒使用cpu資源期間,執行了wait方法,使當前執行緒進入到等待狀態,等待狀態的執行緒是不會主動進入到執行緒佇列中排隊等待cpu資源,必須由其他線
程呼叫notify方法通知它,使得它重新進入到執行緒佇列中排隊等待cpu資源,以便從中斷處繼續執行。

4.執行緒使用cpu資源期間,執行某個操作進入阻塞狀態,比如執行讀寫操作引起阻塞。進入阻塞狀態時執行緒不能進入排隊佇列,只有當引起阻塞的原因消除時,
執行緒才重新進入執行緒佇列中排隊等待cpu資源,以便從原來中斷處開始繼續執行。

4.死亡
處於死亡狀態的執行緒不具有繼續執行的能力。執行緒死亡的原因有兩個,一個是正常執行的執行緒完成了它的所有工作,即執行完run方法中的所有語句,結束了run方法;
另一個原因是執行緒被提前強制性終止,即強制run方法結束。所謂死亡狀態,就是執行緒釋放了實體,即釋放給執行緒物件的記憶體

package ThreadMechanism;

public class SpeakHello extends Thread {
    public void run(){
        for(int i=0;i<10;i++){
            System.out.println("Hello"+i);
        }
    }

}
package ThreadMechanism;

public class SpeakWelcome extends Thread {
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("Welcome" + i);
        }
    }

}
package ThreadMechanism;
//java裡面多執行緒執行程式
public class Demo1 {
    public static void main(String args[]) {
/*      該過程總共有三個執行緒,main是主執行緒,然後主執行緒執行
        然後建立了兩個其他執行緒,此時這兩個hello和welcome都具有了相應的記憶體空間和其它資源
        呼叫start兩個執行緒進入到執行緒佇列中,如果他們得到cpu資源就相應的呼叫run方法,此時3個執行緒搶佔cpu資源,然後各個執行緒使用一會cpu資源,直到執行完run方法
        主執行緒*/
        SpeakHello hello=new SpeakHello();//建立一個執行緒1
        SpeakWelcome welcome=new SpeakWelcome();//建立一個執行緒2
        welcome.start();//啟動執行緒2
        hello.start();//啟動執行緒1
        for (int i = 1; i < 10; i++) {
            System.out.println("大家好"+i);
        }
    }
}

這裡寫圖片描述
這是執行之後結果程式碼
這裡寫圖片描述

相關推薦

Java執行筆記

之前寫的程式碼都是單執行緒的,只有一個主執行緒,main方法,即一個程式只有一條從頭到尾的執行線索。然而現實世界中的很多過程都具有多條線索同時動作的特性。 java語言的特點是內建了對多執行緒的支援。 每個程序都有一段專用的記憶體區域,執行緒間可以共享相同的

二十JAVA執行筆記執行上下文設計模式(ThreadLocal)

        上下文是貫穿整個系統或階段生命週期的物件,其中包含了系統全域性的一些資訊,比如登入後的使用者資訊、賬號資訊,以及在程式每一個階段執行時的資料。         設計時要考慮到全域性唯一性,還要考慮有些

Java執行)基礎

1.關於執行緒與程序的區別:執行緒指程序中的一個執行場景,也就是執行流程,同一個程序中的執行緒共享其程序中的記憶體和資源(共享的記憶體是堆記憶體和方法區記憶體,棧記憶體不共享,每個執行緒有自己的,一個執行緒一個棧。);每個程序是一個應用程式,都有獨立的記憶體空間。多執行緒的使用是為了提高程式

Java 執行)—— 概念的引入

  併發和並行      程序和執行緒      如何建立多執行緒      第一種方法:繼承 Thread 類      第二種方法:實現 Runnable 介面      第三種方法:使用匿名內部類建立執行緒      正文      回到頂部      併發和並行      並行:指兩個或多個

java 執行種實現方式

private ThreadPoolExecutor threadPoolExecutor; /** * 獲取執行緒池 * @return */ private ThreadPoolExecutor getThreadPoolExecutor(){

深入理解Java執行

關於java多執行緒的概念以及基本用法:java多執行緒基礎 1,停止執行緒 停止執行緒意味著線上程執行完之前停止正在做的操作,即立刻放棄當前的操作,這並不容易。停止執行緒可以用Thread.stop()方法,但是這個方法不安全,所以不建議使用,還有一個方法就是Thre

Java執行) 什麼是執行

宣告:本系列大多是翻譯自https://www.javatpoint.com,加上自己的增刪改,盡力寫的系統而通俗易懂,後文不再重複宣告。 java的多執行緒是一個同時執行多個執行緒的過程。 執行緒是一個輕量級的子程序,是最小的處理單元。多執行緒和多程序都用於實現多工處理。 但是,我們使用多執

java執行):執行的五種基本狀態以及生命週期

1、Java執行緒具有五中基本狀態: 新建狀態(New):當執行緒物件對建立後,即進入了新建狀態,如:Thread thread1 = new MyThread(); 就緒狀態(Runnable):當呼叫執行緒物件的start()方法[ 如:thread1 .start(); ],執行緒

結合生活,剖析《生產者消費者模型》-java執行

  部落格園的園友們好,看部落格園上各位大佬的文章,已陪伴了我程式設計師職業的三年, 如今自己同樣希望能把自己從小白到菜鳥的成長過程分享給大家。不定期更新!!! 首先我本人智商不高,理解問題十分吃力,完全不屬於天才的行列,因此學習每一個知識 都喜歡刨根問底,結合生活,徹徹底底理解知識的本質! 進入正題,這篇文

Java執行):執行基礎及建立

(一)、執行緒的生命週期 新建狀態: 使用 new 關鍵字和 Thread 類或其子類建立一個執行緒物件後,該執行緒物件就處於新建狀態。它保持這個狀態直到程式 start() 這個執行緒。 就緒狀態: 當執行緒物件呼叫了start()方法之後,該執行緒就進入就緒

Java執行筆記分享

1.多執行緒的結構 2.執行緒和程序 執行緒和程序是不一樣的 程序>執行緒 執行緒是最小的一個單位 3.多執行緒的實現 1.繼承Thread類(就是java.lang.Thread) java.lang.Thread是一個執行緒操作的核心類。如果想要定義

Java執行筆記總結

1.執行緒的三種建立方式 對比三種方式: 通過繼承Thread類實現 通過實現Runnable介面 實現Callable介面 第1種方式無法繼承其他類,第2,3種可以繼承其他類; 第2,3種方式多執行緒可以共享同一個target物件,多個執行緒處

Java執行) —— 執行的狀態詳解

一、多執行緒概述  1、 程序 是一個正在執行的程式。是程式在計算機上的一次執行活動。 每一個程序執行都有一個執行順序。該順序是一個執行路徑,或者叫一個控制單元。 系統以程序為基本單位進行系統資源的排程和分配。程式要執行,系統就在記憶體中為該程式分配一塊獨立的記憶體空間,載入程式程式碼和資源進行執行。 程式

python 執行筆記

python thread,threading模組提供了對多執行緒的支援,不過通常我們使用threading模組來進行多執行緒程式設計。 多執行緒模組使用方法:        1. 使用thread模組中的start_new_thread(function,元組引數[,字

Java進階 ——— Java執行)之程序和執行

引言 講到執行緒,不可避免的提到程序。而因為執行緒無法脫離程序單獨存在,那什麼是程序? 延伸閱讀,Java多執行緒系列文章 什麼是程序? 程序:具有一定獨立功能的程式關於某個資料集合上的一次執行活動,程序是系統進行資源分配和排程的最小單位。 例如手機執行的眾多

Java執行 Exchanger

Exchanger類介紹 A synchronization point at which threads can pair and swap elements within pairs. Ea

java執行)(LongAdder)

LongAdder是jdk8新增的用於併發環境的計數器,目的是為了在高併發情況下,代替AtomicLong/AtomicInt,成為一個用於高併發情況下的高效的通用計數器。 高併發下計數,一般最先想到的應該是AtomicLong/AtomicInt,AtmoicXXX使

Java執行)——實現執行的兩種方式

java實現多執行緒的常用方式有兩種:繼承Thread類、實現Runnable介面實現run方法。 繼承Thread實現方式: public class ThreadTest extends Thread{ private int tick

Java執行):執行與程序

1.執行緒和程序 1.1 程序 程序是作業系統的概念,我們執行的一個TIM.exe就是一個程序。 程序(Process)是計算機中的程式關於某資料集合上的一次執行活動,是系統進行資源分配和排程的基本單位,是作業系統結構的基礎。在早期面向程序設計的計算機結構中,程序是程式的基本執行實體;在當代面向執行緒設計

Java執行學習筆記() synchronized同步方法

synchronized同步方法 1.提出問題-例項變數非執行緒安全 1.1 何為非執行緒安全? 1.2 舉例 1.2.1 有私有變數的類HasPrivateNum (供多執行緒們去呼叫) 1.2.2 執行緒A