1. 程式人生 > >Java多執行緒---超詳細總結

Java多執行緒---超詳細總結

        寫在前面的話:此文只能說是java多執行緒的一個入門,其實Java裡頭執行緒完全可以寫一本書了,但是如果最基本的你都學掌握好,又怎麼能更上一個臺階呢?如果你覺得此文很簡單,那推薦你看看Java併發包的的執行緒池(Java併發程式設計與技術內幕:執行緒池深入理解),或者看這個專欄:Java併發程式設計與技術內幕。你將會對Java裡頭的高併發場景下的執行緒有更加深刻的理解。

目錄(?)[-]

        本文主要講了java中多執行緒的使用方法、執行緒同步、執行緒資料傳遞、執行緒狀態及相應的一些執行緒函式用法、概述等。在這之前,首先讓我們來了解下在作業系統中程序和執行緒的區別:

  程序:每個程序都有獨立的程式碼和資料空間(程序上下文),程序間的切換會有較大的開銷,一個程序包含1--n個執行緒。(程序是資源分配的最小單位)

  執行緒:同一類執行緒共享程式碼和資料空間,每個執行緒有獨立的執行棧和程式計數器(PC),執行緒切換開銷小。(執行緒是cpu排程的最小單位)

  執行緒和程序一樣分為五個階段:建立、就緒、執行、阻塞、終止。

  多程序是指作業系統能同時執行多個任務(程式)。

  多執行緒是指在同一程式中有多個順序流在執行。

java中要想實現多執行緒,有兩種手段,一種是繼續Thread類,另外一種是實現Runable介面.(其實準確來講,應該有三種,還有一種是實現Callable介面

,並與Future、執行緒池結合使用,此文這裡不講這個,有興趣看這裡Java併發程式設計與技術內幕:Callable、Future、FutureTask、CompletionService)

一、擴充套件java.lang.Thread類

這裡繼承Thread類的方法是比較常用的一種,如果說你只是想起一條執行緒。沒有什麼其它特殊的要求,那麼可以使用Thread.(筆者推薦使用Runable,後頭會說明為什麼)。下面來看一個簡單的例項

  1. package com.multithread.learning;  
  2. /** 
  3.  *@functon 多執行緒學習 
  4.  *@author 林炳文
     
  5.  *@time 2015.3.9 
  6.  */
  7. class Thread1 extends Thread{  
  8.     private String name;  
  9.     public Thread1(String name) {  
  10.        this.name=name;  
  11.     }  
  12.     publicvoid run() {  
  13.         for (int i = 0; i < 5; i++) {  
  14.             System.out.println(name + "執行  :  " + i);  
  15.             try {  
  16.                 sleep((int) Math.random() * 10);  
  17.             } catch (InterruptedException e) {  
  18.                 e.printStackTrace();  
  19.             }  
  20.         }  
  21.     }  
  22. }  
  23. publicclass Main {  
  24.     publicstaticvoid main(String[] args) {  
  25.         Thread1 mTh1=new Thread1("A");  
  26.         Thread1 mTh2=new Thread1("B");  
  27.         mTh1.start();  
  28.         mTh2.start();  
  29.     }  
  30. }  
輸出:

A執行  :  0
B執行  :  0
A執行  :  1
A執行  :  2
A執行  :  3
A執行  :  4
B執行  :  1
B執行  :  2
B執行  :  3
B執行  :  4

再執行一下:

A執行  :  0
B執行  :  0
B執行  :  1
B執行  :  2
B執行  :  3
B執行  :  4
A執行  :  1
A執行  :  2
A執行  :  3
A執行  :  4
說明: 程式啟動執行main時候,java虛擬機器啟動一個程序,主執行緒main在main()呼叫時候被建立。隨著呼叫MitiSay的兩個物件的start方法,另外兩個執行緒也啟動了,這樣,整個應用就在多執行緒下執行。 注意:start()方法的呼叫後並不是立即執行多執行緒程式碼,而是使得該執行緒變為可執行態(Runnable),什麼時候執行是由作業系統決定的。 從程式執行的結果可以發現,多執行緒程式是亂序執行。因此,只有亂序執行的程式碼才有必要設計為多執行緒。 Thread.sleep()方法呼叫目的是不讓當前執行緒獨自霸佔該程序所獲取的CPU資源,以留出一定時間給其他執行緒執行的機會。 實際上所有的多執行緒程式碼執行順序都是不確定的,每次執行的結果都是隨機的。

但是start方法重複呼叫的話,會出現java.lang.IllegalThreadStateException異常。

  1. Thread1 mTh1=new Thread1("A");  
  2. Thread1 mTh2=mTh1;  
  3. mTh1.start();  
  4. mTh2.start();  

輸出:

Exception in thread "main" java.lang.IllegalThreadStateException
    at java.lang.Thread.start(Unknown Source)
    at com.multithread.learning.Main.main(Main.java:31)

A執行  :  0
A執行  :  1
A執行  :  2
A執行  :  3
A執行  :  4

二、實現java.lang.Runnable介面

採用Runnable也是非常常見的一種,我們只需要重寫run方法即可。下面也來看個例項。

  1. /** 
  2.  *@functon 多執行緒學習 
  3.  *@author 林炳文 
  4.  *@time 2015.3.9 
  5.  */
  6. package com.multithread.runnable;  
  7. class Thread2 implements Runnable{  
  8.     private String name;  
  9.     public Thread2(String name) {  
  10.         this.name=name;  
  11.     }  
  12.     @Override
  13.     publicvoid run() {  
  14.           for (int i = 0; i < 5; i++) {  
  15.                 System.out.println(name + "執行  :  " + i);  
  16.                 try {  
  17.                     Thread.sleep((int) Math.random() * 10);  
  18.                 } catch (InterruptedException e) {  
  19.                     e.printStackTrace();  
  20.                 }  
  21.             }  
  22.     }  
  23. }  
  24. publicclass Main {  
  25.     publicstaticvoid main(String[] args) {  
  26.         new Thread(new Thread2("C")).start();  
  27.         new Thread(new Thread2("D")).start();  
  28.     }  
  29. }  
輸出:

C執行  :  0
D執行  :  0
D執行  :  1
C執行  :  1
D執行  :  2
C執行  :  2
D執行  :  3
C執行  :  3
D執行  :  4
C執行  :  4

說明: Thread2類通過實現Runnable介面,使得該類有了多執行緒類的特徵。run()方法是多執行緒程式的一個約定。所有的多執行緒程式碼都在run方法裡面。Thread類實際上也是實現了Runnable介面的類。 在啟動的多執行緒的時候,需要先通過Thread類的構造方法Thread(Runnable target) 構造出物件,然後呼叫Thread物件的start()方法來執行多執行緒程式碼。 實際上所有的多執行緒程式碼都是通過執行Thread的start()方法來執行的。因此,不管是擴充套件Thread類還是實現Runnable介面來實現多執行緒,最終還是通過Thread的物件的API來控制執行緒的,熟悉Thread類的API是進行多執行緒程式設計的基礎。

三、Thread和Runnable的區別

如果一個類繼承Thread,則不適合資源共享。但是如果實現了Runable介面的話,則很容易的實現資源共享。

總結:

實現Runnable介面比繼承Thread類所具有的優勢:

1):適合多個相同的程式程式碼的執行緒去處理同一個資源

2):可以避免java中的單繼承的限制

3):增加程式的健壯性,程式碼可以被多個執行緒共享,程式碼和資料獨立

4):執行緒池只能放入實現Runable或callable類執行緒,不能直接放入繼承Thread的類

提醒一下大家:main方法其實也是一個執行緒。在java中所以的執行緒都是同時啟動的,至於什麼時候,哪個先執行,完全看誰先得到CPU的資源。

java中,每次程式執行至少啟動2個執行緒。一個是main

相關推薦

Java執行---詳細總結

        寫在前面的話:此文只能說是java多執行緒的一個入門,其實Java裡頭執行緒完全可以寫一本書了,但是如果最基本的你都學掌握好,又怎麼能更上一個臺階呢?如果你覺得此文很簡單,那推薦你看看Java併發包的的執行緒池(Java併發程式設計與技術內幕:執行

Java執行學習與總結(Join)

join()方法的用法: join()是主執行緒 等待子執行緒的終止。也就是在子執行緒呼叫了 join() 方法後面的程式碼,只有等到子執行緒結束了才能執行。 例子如下: Java程式碼 p

Java執行學習與總結(ThreadGroup)

在Java中每個執行緒都屬於某個執行緒組(ThreadGroup)。例如,如果在main()中產生一個執行緒,則這個執行緒屬於main執行緒組管理的一員,您可以使用下面的指令來獲得目前執行緒所屬的執行緒組名稱: Java程式碼

java執行程式設計詳細入門教程

##1、概念      執行緒是jvm排程的最小單元,也叫做輕量級程序,程序是由執行緒組成,執行緒擁有私有的程式技術器以及棧,並且能夠訪問堆中的共享資源。這裡提出一個問題,為什麼要用多執行緒?有一下幾點,首先,隨著cpu核心數的增加,計算機硬

Java執行程式設計詳細解析

Java多執行緒程式設計詳細解析   一、理解多執行緒多執行緒是這樣一種機制,它允許在程式中併發執行多個指令流,每個指令流都稱為一個執行緒,彼此間互相獨立。執行緒又稱為輕量級程序,它和程序一樣擁有獨立的執行控制,由作業系統負責排程,區別在於執行緒沒有獨立的儲存空間,而是和所屬程

c++ 網路程式設計(九)TCP/IP LINUX/windows下 執行詳細教程 以及 執行實現服務端

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <process.h> #include <winsock2.h> #include <win

c++ 網路程式設計(九)TCP/IP LINUX/windows下 執行詳細教程 以及 執行實現服務端

原文作者:aircraft 原文連結:https://www.cnblogs.com/DOMLX/p/9661012.html  先講Linux下(windows下在後面可以直接跳到後面看): 一.執行緒基本概念 前面我們講過多程序伺服器,但我們知道它開銷很大

Java執行程式設計學習總結(二)

  (尊重勞動成果,轉載請註明出處:https://blog.csdn.net/qq_25827845/article/details/84894463冷血之心的部落格) 系列文章: Java多執行緒程式設計學習總結(一) Java多執行緒程式設計學習總結(二) 前

Java 執行程式設計學習總結(一)

定義篇 程序(Process)和執行緒(Thread) 怎樣實現多工處理(Multitasking)? 多工處理是同時執行多個任務的過程。我們使用多工處理來利用 CPU。可通過兩種方式實現多工處理: · 基於程序的多工 (多重處理) · 基於執行緒的多工處理

JAVA執行常見問題總結

看這片文章之前,請問讀者有沒有對高併發以及concurrent工具包(jdk1.5推出)有一個初略的認識,以及有沒有編碼實戰經驗? 1、多執行緒有什麼用? 一個可能在很多人看來很扯淡的一個問題:我會用多執行緒就好了,還管它有什麼用?在我看來,這個回答更扯淡。所謂"知其然

Java執行詳解總結

### 一、基本概念 **程式(program)**: 是為完成特定任務、用某種語言編寫的一組指令的集合。即指一 段靜態的程式碼,靜態物件。 **程序(process)**:是程式的一次執行過程,或是正在執行的一個程式。是一個動態 的過程:有它自身的產生、存在和消亡的過程。——生命週期 - 執行中的

Java執行學習---------詳細總結(java 執行 同步 資料傳遞 )

平時專案中多執行緒的應用比較少,今天網上找了找相關的內容學習了下。看到下面的文章感覺比較好。 轉自:http://www.cnblogs.com/1020182600HENG/p/5939933.html 目錄 一擴充套件javalangThread類 二實現javalan

Java執行面試知識點彙總(詳細總結

一、sleep()方法、wait()方法、yeild()方法、interrupt()方法、notify()、notifyAll()方法 1、sleep()方法: sleep方法為Thread的靜態方法; sleep方法的作用是讓執行緒休眠指定時間,在時間到

Java執行學習(吐血詳細總結

        寫在前面的話:此文只能說是java多執行緒的一個入門,其實Java裡頭執行緒完全可以寫一本書了,但是如果最基本的你都學掌握好,又怎麼能更上一個臺階呢?如果你覺得此文很簡單,那推薦你看看Java併發包的的執行緒池(Java併發程式設計與技術內幕:執行緒池深入理解

執行的使用,Java執行學習(吐血詳細總結

多執行緒的使用 首先講一下程序和執行緒的區別:     程序:每個程序都有獨立的程式碼和資料空間(程序上下文),程序間的切換會有較大的開銷,一個程序包含1--n個執行緒。     執行緒:同一類執行緒共享程式碼和資料空間,每個執行緒有獨立的執行棧和程式計數器(PC),執行緒切換開銷小。

Java執行學習(詳細總結

目錄(?)[-]      本文主要講了java中多執行緒的使用方法、執行緒同步、執行緒資料傳遞、執行緒狀態及相應的一些執行緒函式用法、概述等。 首先講一下程序和執行緒的區別:   程序:每個程序都有獨立的程式碼和資料空間(程序上下文),程序間的切換會有較大的

總結-Java執行與高併發簡記

1、什麼是多執行緒? 一個程序可以開啟多個執行緒,每個執行緒可以併發/並行執行不同任務。 2、Java多執行緒實現方式    2.1、繼承Thread類    2.2、實現Runnable介面方式實現多執行緒    2.3、使

java基礎總結(三十二)--java執行程式設計例項

來自:https://blog.csdn.net/qq_34996727/article/details/80416277或者https://www.cnblogs.com/pureEve/p/6524366.html 一.相關知識:   Java多執行緒程式設計到的知識:

java執行--練習題總結

目錄   練題1:編寫程式實現,子執行緒迴圈3次,接著主執行緒迴圈5次,接著再子執行緒迴圈3次,主執行緒迴圈5次,如此反覆,迴圈3次. 練習題2:設計四個執行緒,其中兩個執行緒每次對變數i加1,另外兩個執行緒每次對i減1. 練習題3:自己編寫程式碼,實現生產者-消費者模

Java執行思維導圖總結

自己學習總結了一些思維導圖(持續更新中),後面附有GitHub連結 ,分享給大家。https://github.com/panjianlong13/MindMapSummary             &n