1. 程式人生 > >【多執行緒】執行緒的基本概念

【多執行緒】執行緒的基本概念

一、前言:

       提及多執行緒不得不提及“程序”這個概念。“百度百科”裡對“程序”的解析如下:程序是一個具有一定獨立功能的程式關於某個資料集合的一次執行活動。它是作業系統動態執行的基本單元,在傳統的作業系統中,程序既是基本的分配單元,也是基本的執行單元。

       初看這個文字會覺得十分的抽象,難以理解。但看到下面的圖片,大家可能會對“程序”有一個感性的認知。一個PID對應一個程序。(P表示process)

     Linux系統中程序的表現形式如下:


       那什麼是執行緒呢?執行緒可以理解成是在程序中獨立執行的子任務。比如QQ.exe執行時就會有很多的子任務在同時執行。再如,好友視訊執行緒、下載檔案執行緒、傳輸資料執行緒、傳送表情執行緒等。這些不同的任務或者說功能都可以同時執行,其中每一個任務

完全可以理解成是“執行緒”在工作,傳檔案、聽音樂、傳送圖片表情等功能都有對應的執行緒在後臺默默地執行。

       (PS:任務是最抽象的,是一個一般性的術語,指由軟體完成的一個活動。一個任務既可以是一個程序,也可以是一個執行緒。簡而言之,它指的是一系列共同達到某一目的的操作。 )

       還是來張圖吧,看一看“酷我”程序對應的執行緒數為45個。

二、多執行緒優勢

       為了更好的理解多執行緒的優勢,看下圖單任務和多工的模型圖。


       任務1和任務2是兩個完全獨立、互不相關的兩個任務。

       在單任務環境下,任務1等待遠端伺服器返回資料,以便進行後期的處理,這是CPU一直處於等待狀態,如果任務2是10s之後被執行,雖然任務2用的時間僅有1秒,但也必須在任務1結束後才能執行任務2。單任務的特點就是排隊執行,也就是同步,就像在cmd中輸入一條命令後,必須等待這條命令執行完才可以執行下一條命令一樣。這就是單任務環境的缺點,即CPU利用率非常低

      在多工環境下,CPU完全可以在任務1和任務2之間來回切換,使任務2不必等到10s再執行。CPU的利用率大大提高。這就是要使用多執行緒技術、要學習多執行緒的原因。這是多執行緒的優點,使用多執行緒也就是在使用非同步。

三、使用多執行緒

       一個程序正在執行時至少會有1個執行緒在執行,這種情況在Java中是存在的。這些執行緒在後臺默默地執行,比如呼叫public static void main()方法的執行緒就是這樣的,而且它是由JVM建立的。如下圖

在控制檯中輸出的main其實就是一個名詞叫做main的執行緒在執行main方法中的程式碼。另外需要說明一下,在控制檯輸出的main和main方法沒有任何的關係。僅僅是名字一樣。

1、執行緒呼叫的隨機性:

     執行緒呼叫具有隨機性,也就是說程式碼的執行結果與程式碼執行順序或呼叫順序是無關的


2、執行緒的隨機性

public class ThreadTest1 extends Thread {
	//測試執行緒的隨機數
	public void run(){
		try {
			for (int i = 0; i < 10; i++) {
				int time=(int)(Math.random()*1000);
				Thread.sleep(time);
				System.out.println("正在執行的執行緒名為:" +Thread.currentThread().getName());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		try {
			ThreadTest1 threadTest1=new ThreadTest1();
			threadTest1.setName("ThreadTest1");
			threadTest1.start();
			for (int i = 0; i < 10; i++) {
				int time=(int)(Math.random()*1000);
				Thread.sleep(time);
				System.out.println("正在執行的執行緒名為:" +Thread.currentThread().getName());
			}
		} catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
		}
	}
}
輸出結果為:

                                  

      為了展示執行緒具有隨機特性,所以使用隨機數的形式來模擬執行緒掛起的效果。從而表現出CPU執行哪個執行緒具有不確定性。

      Thread類中的start()和run()方法有什麼區別?

       執行緒通常都有5種狀態:建立、就緒、執行、阻塞和死亡。

       1)、建立狀態:在生成執行緒物件,沒有呼叫該物件的start()方法之前,這時執行緒處於建立狀態。

       2)、就緒狀態:當呼叫了執行緒物件的start方法之後,該執行緒就進入就緒狀態,但此時執行緒排程程式還沒有把該執行緒設定為當前執行緒,此時處於就緒狀態。線上程執行之後,從等待或睡眠中回來之後,也會處於就緒狀態。

       3)、執行狀態:執行緒排程程式將處於就緒狀態的執行緒設定為當前執行緒,此時執行緒就進入執行狀態,開始執行run函式當中的程式碼。

       4)、阻塞狀態:執行緒正在執行的時候,被暫停之後再繼續執行。sleep、suspend、wait等方法都可以導致執行緒阻塞。

       5)、死亡狀態:如果一個執行緒的run方法 執行結束或者呼叫stop方法後,該執行緒就會死亡。對於已經死亡的執行緒,無法再使用start方法令其進入就緒。


相關推薦

C++復習1.1基本概念

using arr 消息 開始 函數返回 執行函數 c++程序 不能 定義 1、C++對大小寫敏感; 2、查看運行結果 cin.get(); cin.get(); 使用兩行代碼使程序運行後暫停,而不是立即結束,出現閃退效果。 第一條cin.get()語句是在輸入並按En

執行執行基本概念

一、前言:        提及多執行緒不得不提及“程序”這個概念。“百度百科”裡對“程序”的解析如下:程序是一個具有一定獨立功能的程式關於某個資料集合的一次執行活動。它是作業系統動態執行的基本單元,在傳統的作業系統中,程序既是基本的分配單元,也是基本的執行單元。      

執行執行

1、好處 第一:降低資源消耗。通過重複利用已建立的執行緒降低執行緒建立和銷燬造成的消耗。 第二:提高響應速度。當任務到達時,任務可以不需要等到執行緒建立就能立即執行。 第三:提高執行緒的可管理性。執行緒是稀缺資源,如果無限制地建立,不僅會消耗系統資源, 還會降低系統的穩定性,使用執行

Java執行執行狀態、執行池狀態

執行緒狀態:     執行緒共包括以下5種狀態。1. 新建狀態(New)  執行緒物件被建立後,就進入了新建狀態。例如,Thread thread = new Thread()。2. 就緒狀態(Runnable)  也被稱為“可執行狀態”。執行緒物件被建立後,

Java執行執行池的工作原理詳解(下)

接著上篇文章,我接下來繼續介紹執行緒池的工作原理,如果你還沒有看上篇,我建議最好瀏覽一下:執行緒池的工作原理詳解(上) Executors 工具類 1.定義 Executors是java執行緒池的工廠類,通過它可以快速初始化一個符合業務需求的執行緒池。

java執行執行常用操作方法總結

文章目錄 執行緒的命名與獲取 執行緒休眠 執行緒中斷 執行緒強制執行 執行緒禮讓 執行緒優先順序 多執行緒的主要操作方法都在Thread類中定義了。 執行緒的

執行執行通訊之join、ThreadLocal

一、方法join       在很多情況下,主執行緒建立並啟動子執行緒,如果子執行緒中需要進行大量的耗時運算,主執行緒往往將早於子執行緒結束之前結束。如果主執行緒想等待子執行緒執行完成之後在結束,比如子執行緒執行一個方法,主執行緒要取得這個方法的返回值,就要用到join()方

執行執行互斥之synchronized 詳解

定義: 執行緒互斥是指某一資源同時只允許一個訪問者對其進行訪問,具有唯一性和排它性。但互斥無法限制訪問者對資源的訪問順序,即訪問是無序的。 我們都知道保證執行緒完整執行。則需要對其加鎖。使用synchronized關鍵字。在這裡鎖的物件理論上可以為任何物件。

執行執行中的同步鎖synchronized

當多個執行緒同時執行時,由於cpu是隨機分片的,所以,一個執行緒在執行過程中被另一個執行緒打斷的情況是經常發生的。 這在某些情況下是會影響到正常的程式的輸出結果的。比如銀行轉賬一個人的賬戶在轉賬時是不能

Java執行執行同步機制

執行緒同步是為了確保執行緒安全,所謂執行緒安全指的是多個執行緒對同一資源進行訪問時,有可能產生資料不一致問題,導致執行緒訪問的資源並不是安全的。如果多執行緒程式執行結果和單執行緒執行的結果是一樣的,且相

Android 併發程式設計執行間通訊的三種基本方式,android執行

1. 使用管道流Pipes “管道”是java.io包的一部分。它是Java的特性,而不是Android特有的。一條“管道”為兩個執行緒建立一個單向的通道。生產者負責寫資料,消費者負責讀取資料。 下面是一個使用管道流進行通訊的例子。 public class Pip

linux執行執行安全之條件變數

條件變數用法: 條件變數一般和互斥量配合,保護執行緒安全或者完成同步資料的功能。 #include <pthread.h> #define INFINITE 0xFFFFFFFF #ifndef ETIMEDOUT #define ETIMEDOUT 10060 #endif

Java虛擬機器執行安全與鎖優化

執行緒安全與鎖優化 絕對執行緒安全 相對執行緒安全 執行緒安全的實現方式 互斥同步 非阻塞同步 鎖優化 參考 絕對執行緒安全 當多個執行緒訪問一個物件時,如果不用考慮這些執行緒在執行時環境

執行涉及的一些基本概念

在看多執行緒之前看一些基本概念 一: 執行緒:執行緒是CPU排程(執行任務)的最小單位;其實質就是一段程式碼(一個任務) 程序:系統中正在執行的一個應用程式;程序是CPU分配資源和排程的單位 兩者的聯絡與區別:

Linux 執行執行同步《二》

1、讀寫鎖 與互斥量類似,但讀寫鎖允許更高的並行性。其特性為:寫獨佔,讀共享。 讀寫鎖狀態: 一把讀寫鎖具備三種狀態:     (1)讀模式下加鎖狀態 (讀鎖)     (2)寫模式下加鎖狀態 (寫鎖)     (3)不加鎖狀態 讀寫鎖

Linux 執行執行同步《三》

1、條件變數 條件變數是利用執行緒間共享的全域性變數進行同步的一種機制,主要包括兩個動作:一個執行緒等待"條件變數的條件成立"而掛起;另一個執行緒使"條件成立"(給出條件成立訊號)。為了防止競爭,條件變數的使用總是和一個互斥 (1)建立和登出       

程序與執行(一)--基本概念(轉)

程序(英語:Process,中國大陸譯作程序,臺灣譯作行程) 是具有一定獨立功能的程式關於某個資料集合上的一次執行活動,是系統進行資源分配和排程的一個獨立單位。程式是一組指令的有序集合,它本身沒有任何執行的含義,只是一個靜態實體。程序是程式在某個資料集上的執行,是一個動態實體(程序本身不會執行,是執行緒的容器

Linux/OS/Network執行以及其與程序區別

執行緒建立、終止、等待、同步、有關分離相關程式碼見: 前言: 程序在各自獨立的地址空間中執行,程序之間共享資料需要用mmap或者程序間通訊機制,有些情況需要在一個程序中同時執行多個控制流程,這時候執行緒就派上了用場,比如:實現一個圖形介面的下載軟

Java8原始碼分析執行-Thread類的全面剖析

一、基本知識 (1)執行緒特性 每個執行緒均有優先順序 執行緒能被標記為守護執行緒 每個執行緒均分配一個name (2)建立執行緒的方法 繼承Thread類,並重現run方法 // 繼承Thread類 class PrimeThread e

java併發程式設計執行池原理分析及ThreadPoolExecutor原始碼實現

執行緒池簡介:  多執行緒技術主要解決處理器單元內多個執行緒執行的問題,它可以顯著減少處理器單元的閒置時間,增加處理器單元的吞吐能力。         假設一個伺服器完成一項任務所需時間為:T1 建立執行緒時間,T2 線上程中執行任務的時間,T3 銷燬執行緒時間。