亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

02.Java 多線程 - Thread

2019-11-06 07:01:43
字體:
來源:轉載
供稿:網友

基本概念

進程 & 線程的概念:

進程:在某種程度上表示相互隔離的、獨立運行的程序。

線程:也稱作輕量級進程。就象進程一樣,線程在程序中是獨立的、并發的執行路徑,每個線程有它自己的堆棧、自己的程序計數器和自己的局部變量。

進程 & 線程的區別:

與分隔的進程相比,進程中的線程之間的隔離程度要小。

進程可以支持多個線程,它們看似同時執行,但互相之間并不同步。一個進程中的多個線程共享相同的內存地址空間,這就意味著它們可以訪問相同的變量和對象,而且它們從同一堆中分配對象。

java 中,用 Thread 類表示線程。


線程狀態

在 Thtead 的內部有個枚舉類,它定義了線程的狀態:

public enum State { NEW, // 新建狀態 RUNNABLE, // 就緒狀態(即可執行狀態) BLOCKED, // 阻塞狀態 WAITING, // 等待狀態 TIMED_WAITING, // 等待狀態(有時間限制) TERMINATED; // 死亡狀態}

1.新建狀態

NEW ,指線程剛創建, 尚未啟動


2.就緒狀態

RUNNABLE ,表示線程可以正常參與競爭 CPU 資源,成功率與其優先級高低有關。


3.阻塞狀態

BLOCKED,表示線程進入阻塞并監視鎖的狀態。

它存在于多個線程有同步操作的場景。比如正在等待另一個線程的 synchronized 塊的執行釋放。


4.等待狀態

WAITING ,該狀態下的線程表示正在等待另外一個線程的動作。

例如:

調用了 wait 方法且沒有超時,進入等待狀態,等待另一個線程調用 notify/notiyfAll 方法。調用了 join 方法且沒有超時 ,進入等待狀態,等待另一個線程終止。調用了 LockSupport.park ,進入等待狀態,等待另一個線程調用 LockSupport.park。

5.有時間限制的等待狀態

TIMED_WAITING ,存在于:

調用了 wait / wait(long) 方法且沒有超時 調用了 join 方法且沒有超時調用了 LockSupport.parkNanos/LockSupport.parkUntil 方法

6.終止狀態

TERMINATED ,表示線程已完成執行。

線程優先級

線程的優先級具有以下特點:

優先級代表獲取 CPU 資源的概率,優先級高的線程獲取的概率較大。

優先級無法保證線程的執行次序,因為這個一個概率問題。

線程的優先級用1-10之間的整數表示,數值越大優先級越高,默認的優先級為5。

在一個線程中開啟另外一個新線程,則新開線程稱為該線程的子線程,子線程初始優先級與父線程相同。

在 Thhtead 類中,定義了三個優先級常量:

// 最小public final static int MIN_PRIORITY = 1;// 默認public final static int NORM_PRIORITY = 5;// 最大public final static int MAX_PRIORITY = 10;

源碼分析

1.線程創建

在 Java 中,用 Thread 表示線程類,它實現了 Runnbale 接口。

首先來看它的簽名:

// 簽名public class Thread implements Runnable// 接口public interface Runnable { public abstract void run();}

再來看它的部分構造函數:

public Thread() { init(null, null, "Thread-" + nextThreadNum(), 0);}public Thread(Runnable target) { init(null, target, "Thread-" + nextThreadNum(), 0);}public Thread(String name) { init(null, null, name, 0);}public Thread(Runnable target, String name) { init(null, target, name, 0);}private void init(ThreadGroup g, Runnable target, String name, long stackSize) { init(g, target, name, stackSize, null);}// 關鍵private void init(ThreadGroup g, Runnable target, String name, long stackSize, accessControlContext acc){...}

從代碼可知,構建線程的真正過程在 init 方法中實現。構建一個線程所需要的必要參數有:

ThreadGroup :線程組,表示一個線程的集合。此外,線程組也可以包含其他線程組。線程組構成一棵樹,在樹中,除了初始線程組外,每個線程組都有一個父線程組。

target:目標,即運行內容,可通過 run 方法執行。

name:線程名稱,默認是 Thread-id,每個線程都不有不同的線程名。

stackSize:開辟新增線程所需的??臻g,為 0 表示忽略該參數。

AccessControlContext :上下文。


2.線程就緒

構建一個線程后,可以通過 start 方法來啟動它,同時也表示線程進入就緒狀態。

同樣的,也可以同調用 Thread 的 yeid 方法來已經運行線程重新進入就緒狀態。

yield

public static native void yield();

start

// 線程狀態,默認為 0,表示線程還未啟動,即 NEW 狀態private volatile int threadStatus = 0;// 表示線程的線程組private ThreadGroup group;public synchronized void start() { if (threadStatus != 0){ //拋出異常... } // 加入線程組 group.add(this); boolean started = false; try { // 關鍵 start0(); started = true; } finally { try { // 啟動失敗,通知線程組 if (!started) { group.threadStartFailed(this); } } catch (Throwable ignore) { // do nothing... } }}// 使用了本地調用,通過 C 代碼初始化線程需要的系統資源。private native void start0();

3.線程運行

線程在啟動之后,會自動調用 run 方法,執行規定好的內容。

private Runnable target;public void run() { if (target != null) { target.run(); }}

由代碼可知,線程在啟動后會自動執行 Runnable.run 定義的內容。


4.線程中斷

線程中斷,并不是指中斷線程的運行,而是指設置線程的中斷標記位。

在 Thread 類中,有三個方法跟中斷標記位有關:

public static void main(String[] args) { // interrupt:設置線程的中斷狀態 Thread.currentThread().interrupt(); // interrupted:返回線程的上次的中斷狀態,并清除中斷狀態 System.out.println(Thread.currentThread().interrupted()); // isInterrupt:返回線程的上次的中斷狀態 System.out.println(Thread.currentThread().isInterrupted());}

下面來看它們的具體實現:

interrupt,設置線程的中斷狀態// 用于同步,表示鎖對象private final Object blockerLock = new Object();private volatile Interruptible blocker;public void interrupt() { if (this != Thread.currentThread()){ // 檢查系統訪問權限 checkAccess(); } synchronized (blockerLock) { Interruptible b = blocker; if (b != null) { // 關鍵 -> 調用本地方法,設置線程中斷標志位 interrupt0(); b.interrupt(this); return; } } interrupt0();}// 設置線程中斷標志位private native void interrupt0();
interrupted,返回線程的上次的中斷狀態,并清除中斷狀態public static boolean interrupted() { return currentThread().isInterrupted(true);}public static native Thread currentThread();// 入參表示是否清除線程中斷標記位private native boolean isInterrupted(boolean ClearInterrupted);isInterrupt,返回線程的上次的中斷狀態public boolean isInterrupted() { return isInterrupted(false);}

5.線程阻塞

若想要令線程進入阻塞狀態,可以調用 Thread 類的 sleep 方法實現。

public static void sleep(long millis, int nanos) throws InterruptedException { if (millis < 0) { // 拋出異常... } if (nanos < 0 || nanos > 999999) { // 拋出異常... } if (nanos >= 500000 || (nanos != 0 && millis == 0)) { millis++; } sleep(millis);}public static native void sleep(long millis) throws InterruptedException;

6.線程等待

在 Thread 類中,想要讓線程進入等待,可以調用 join 方法實現。

Thread t1 = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(3000); System.out.println("t1 完成工作"); } catch (InterruptedException e) { e.printStackTrace(); } }});t1.start();// 關鍵把 t1 線程加入到當前線程,等待 t1 執行結束,main 才能繼續執行t1.join();System.out.println("main 完成工作");

下面再來看看它的具體實現:

public final void join() throws InterruptedException { join(0);}public final synchronized void join(long millis) throws InterruptedException { long base = System.currentTimeMillis(); long now = 0; if (millis < 0) { // 拋出異常... } if (millis == 0) { // 關鍵 -> 線程(指代例子中 t1)存活,則(main)進入等待 while (isAlive()) { wait(0); } } else { while (isAlive()) { long delay = millis - now; if (delay <= 0) { break; } wait(delay); now = System.currentTimeMillis() - base; } }}// 判斷線程是否存活public final native boolean isAlive();

這里同樣有個疑問,既然 mian 進入等待,那么在 t1 結束后如何被喚醒?

正常情況下進入 wait 的 線程,需要其他線程調用 notify/notifyAll 來喚醒。答案在 t1 線程結束后在 JVM 中會調用 notify 方法:

void JavaThread::exit(bool destroy_vm, ExitType exit_type) ;// 確保 join 函數ensure_join(this);static void ensure_join(JavaThread* thread) { Handle threadObj(thread, thread->threadObj()); ObjectLocker lock(threadObj, thread); thread->clear_pending_exception(); java_lang_Thread::set_thread_status(threadObj(), java_lang_Thread::TERMINATED); java_lang_Thread::set_thread(threadObj(), NULL); // 關鍵 -> 調用線程的 notifyAll 方法。 lock.notify_all(thread); thread->clear_pending_exception();}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品综合视频| 欧美激情亚洲综合一区| 亚洲视屏在线播放| 成人精品一区二区三区电影免费| 欧美孕妇性xx| 国产香蕉精品视频一区二区三区| 日本亚洲欧美三级| 欧美极品少妇xxxxⅹ免费视频| 午夜精品一区二区三区av| 尤物九九久久国产精品的特点| 国产成人av网址| 日韩免费高清在线观看| 亚洲一品av免费观看| 日韩欧美在线视频| 九九精品在线观看| 亚洲欧洲日韩国产| 欧日韩在线观看| 96pao国产成视频永久免费| 国产黑人绿帽在线第一区| 精品久久久久久| 国产精品亚洲片夜色在线| 国产美女久久精品香蕉69| 性欧美xxxx视频在线观看| 色综久久综合桃花网| 日韩激情视频在线| 欧美国产精品va在线观看| 久久电影一区二区| 精品视频久久久| 欧美精品在线免费观看| 高清日韩电视剧大全免费播放在线观看| 黄色91在线观看| 国产成人一区二| 日韩av123| 欧美电影免费观看| 久久伊人免费视频| 欧美噜噜久久久xxx| 亚洲第一中文字幕在线观看| 亚洲久久久久久久久久| 国产精品一区电影| 成人欧美一区二区三区在线湿哒哒| 国产在线高清精品| 久久91亚洲精品中文字幕奶水| 日韩中文字幕国产| 91wwwcom在线观看| 色妞欧美日韩在线| 欧美日韩成人在线播放| 日韩精品小视频| 欧美成人精品影院| 欧美激情xxxx| 成人h视频在线观看播放| 久久综合伊人77777尤物| 精品久久久久人成| 久青草国产97香蕉在线视频| 欧美午夜激情在线| 国产精品黄色影片导航在线观看| 97在线免费观看视频| 国产欧美精品一区二区三区-老狼| 国产精品毛片a∨一区二区三区|国| 成人黄色短视频在线观看| 日韩在线中文字幕| 国产一区二区美女视频| 国产视频久久久久久久| 欧美极品少妇xxxxⅹ裸体艺术| 欧美激情xxxx| 青青精品视频播放| 久久久久久香蕉网| 亚洲免费小视频| 国产盗摄xxxx视频xxx69| 亚洲精品国产欧美| 久久精视频免费在线久久完整在线看| 亚洲精品白浆高清久久久久久| 热99精品里视频精品| 亚洲成色www8888| 日韩av大片免费看| 亚洲国产精品久久久久久| 日韩一区二区av| 久久精品国产精品| 97在线观看免费| 欧美黄色片在线观看| 国产欧美精品一区二区三区-老狼| 日本成人黄色片| 国产精品九九久久久久久久| 日韩中文字幕在线精品| 中文字幕亚洲欧美日韩高清| 欧洲成人免费aa| 91久久精品国产| 欧美裸体男粗大视频在线观看| 国产精品视频免费观看www| 亚洲第一区第二区| 日韩欧美在线第一页| 国产精品欧美一区二区| 亚洲欧美精品伊人久久| 亚洲欧美日韩中文在线制服| 色久欧美在线视频观看| 国产精品激情av在线播放| 色香阁99久久精品久久久| 亚洲视频国产视频| 日韩经典中文字幕| 久久精品一本久久99精品| 国产精彩精品视频| 欧美激情xxxxx| 8090成年在线看片午夜| 欧美日韩ab片| 亚洲美女av电影| 日韩欧美国产免费播放| 91国内揄拍国内精品对白| 日韩经典中文字幕在线观看| 正在播放国产一区| 欧美性69xxxx肥| 欧美日韩一二三四五区| 久久久视频在线| 18一19gay欧美视频网站| 日本道色综合久久影院| 国产精品欧美日韩一区二区| 久久久久一本一区二区青青蜜月| 国产精品日韩久久久久| 亚洲欧洲在线播放| 国内精品久久久久久| 久久久久久久久综合| 欧美中文字幕精品| 成人欧美一区二区三区在线湿哒哒| 欧美综合一区第一页| 亚洲欧美日韩图片| 欧美日韩国产综合新一区| 亚洲国产精品视频在线观看| 亚洲91精品在线| 欧美亚洲午夜视频在线观看| 伊人久久五月天| 欧美丰满老妇厨房牲生活| 国产一区欧美二区三区| 精品国产鲁一鲁一区二区张丽| 国产精品丝袜久久久久久高清| 欧美在线一级视频| 91av视频在线播放| 538国产精品一区二区免费视频| 日本欧美黄网站| 亚洲另类欧美自拍| 精品国产乱码久久久久酒店| 欧美裸体视频网站| 成人情趣片在线观看免费| 日韩一中文字幕| 国产一区二区色| 亚洲尤物视频网| 亚洲欧美日韩一区在线| 亚洲欧洲午夜一线一品| www亚洲欧美| 欧美日韩一区二区免费在线观看| 国产精品永久免费| 亚洲欧美另类人妖| 国产激情视频一区| 日韩视频免费在线观看| 欧美黑人巨大精品一区二区| 中日韩美女免费视频网址在线观看| 热99精品只有里视频精品| 欧美日本黄视频| 亚洲欧美激情一区| 亚洲va国产va天堂va久久| 中国日韩欧美久久久久久久久| 亚洲视频专区在线| 亚洲最大成人免费视频| 欧美成人午夜影院| 精品国产鲁一鲁一区二区张丽| 最近2019中文字幕大全第二页| 啊v视频在线一区二区三区|