idea以任意順序debug多線程程序的具體用法
在idea中使用debug可以讓多個(gè)線程以任意順序執(zhí)行,先介紹一下基礎(chǔ)知識(shí),然后介紹具體做法。
1 debug 兩類 Supspend
在斷點(diǎn)處右鍵,可以看到Suspend分兩類,一類是All,一類是Thread。當(dāng)某個(gè)線程到達(dá)斷點(diǎn)處會(huì)觸發(fā)Suspend,All會(huì)使得所有線程都暫停,Thread只會(huì)使當(dāng)前觸發(fā)的線程暫停,其他線程不受影響。
在idea中使用debug可以讓多個(gè)線程以任意順序執(zhí)行,先介紹一下基礎(chǔ)知識(shí),然后介紹具體做法。

以下面的代碼為例,有3個(gè)MyThread線程以及一個(gè)主線程main。3個(gè)線程分別睡眠 1/2/3 秒,主線程睡眠 5 秒。下面分三種情況查看結(jié)果:
- 正常執(zhí)行,執(zhí)行完的順序?yàn)?1, 2, 3, main
- 在斷點(diǎn)1處打斷點(diǎn),設(shè)置為 All,在線程1觸發(fā)后所有線程均暫停,可以通過(guò)Resume繼續(xù)執(zhí)行下一個(gè)斷點(diǎn),正常情況應(yīng)該是3次Resume才能結(jié)束,但在有些時(shí)候idea會(huì)提示 skipped breakpoint at because it happened inside debugger evaluation,會(huì)跳過(guò)一些斷點(diǎn),這可能是ide本身的問(wèn)題,可以在Settings->Build … ->Debugger->Data Views->Java中 取消 Enable ‘toString()' object view。
- 在斷點(diǎn)1處打斷點(diǎn),設(shè)置為 Thread,3個(gè)子線程都會(huì)在斷點(diǎn)處暫停,main線程沒(méi)有暫停,會(huì)先執(zhí)行完。
package org.example;
public class Test{
public static void main(String arg[]){
MyThread thread1 = new MyThread(1);
MyThread thread2 = new MyThread(2);
MyThread thread3 = new MyThread(3);
thread1.setName("Thread 1");
thread2.setName("Thread 2");
thread3.setName("Thread 3");
thread1.start();
thread2.start();
thread3.start();
try {
Thread.sleep(1000*5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主線程完成");
}
private static class MyThread extends Thread {
private int num;
public MyThread(int num) {
this.num = num;
}
@Override
public void run() {
String name = Thread.currentThread().getName();
try {
Thread.sleep(1000*num);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"斷點(diǎn)1"); //斷點(diǎn)1
System.out.println(Thread.currentThread().getName()+"斷點(diǎn)之間執(zhí)行");
System.out.println(Thread.currentThread().getName()+"斷點(diǎn)2"); //斷點(diǎn)2
}
}
2 按照順序執(zhí)行線程
在子線程打兩個(gè)Thread斷點(diǎn),通過(guò)Frames控制子線程的執(zhí)行順序,假設(shè)斷點(diǎn)之間的執(zhí)行順序?yàn)?, 2, 1, 2, 1, 3。其中第一次執(zhí)行從斷點(diǎn)1開始,執(zhí)行到斷點(diǎn)2之前,第二次執(zhí)行會(huì)執(zhí)行斷點(diǎn)2并結(jié)束。
如果感覺(jué)不好理解,可以將MyThread換成三個(gè)不同的類分別對(duì)應(yīng)三個(gè)線程,在三個(gè)類中分別打斷點(diǎn)。這里我不再替換。
debug運(yùn)行,稍等一會(huì),三個(gè)線程都會(huì)到第一個(gè)斷點(diǎn)停下,此時(shí)未有任何輸出,注意在左下角Frames的菜單,點(diǎn)開,會(huì)發(fā)現(xiàn)三個(gè)線程都在Frames內(nèi),這說(shuō)明三個(gè)線程都已經(jīng)暫停,有時(shí)候下拉框會(huì)有main,但其實(shí)main不會(huì)暫停。

想先執(zhí)行Thread 3,則在下拉框選擇Thread 3,點(diǎn)一下Resume,此時(shí)Thread 3的第一個(gè)斷點(diǎn)和斷點(diǎn)之間的代碼執(zhí)行,Thread 3暫停在第二個(gè)斷點(diǎn)上,其他暫停的線程不受影響。

對(duì)應(yīng)的后續(xù)執(zhí)行順序是,切換到Thread 2/1/2/1/3,每次切換都Resume一次。
總結(jié):想讓哪個(gè)線程先執(zhí)行就在下拉框切換到相應(yīng)的線程,并Resume,則該線程執(zhí)行到下一個(gè)斷點(diǎn),如果沒(méi)有下一個(gè)斷點(diǎn)則會(huì)一直執(zhí)行直到結(jié)束。此時(shí),其他暫停的線程會(huì)一直暫停等待。
這樣的做法可以推廣到多個(gè)線程,對(duì)于需要暫停的線程都打上斷點(diǎn)即可,每個(gè)線程可以打多個(gè),方便控制執(zhí)行順序。對(duì)于不需要暫停的線程可以不打斷點(diǎn),就像這里的main線程一樣。
3 Condition的使用
另外如果只想讓某個(gè)線程在斷點(diǎn)處停止,可以使用斷點(diǎn)的Condition,如上面的代碼中只想讓第一個(gè)線程暫停,則可以在斷點(diǎn)處右鍵,在Condition中填入Thread.currentThread().getName().equals(“Thread 1”);

到此這篇關(guān)于idea以任意順序debug多線程程序的文章就介紹到這了,更多相關(guān)idea多線程debug內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaWeb登錄界面登錄失敗在同一頁(yè)面進(jìn)行提示的解決
這篇文章主要介紹了JavaWeb登錄界面登錄失敗在同一頁(yè)面進(jìn)行提示的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Hibernate中實(shí)現(xiàn)增刪改查的步驟詳解
本篇文章主要介紹了Hibernate中實(shí)現(xiàn)增刪改查的步驟與方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02
Java后臺(tái)防止客戶端重復(fù)請(qǐng)求、提交表單實(shí)現(xiàn)原理
這篇文章主要介紹了Java后臺(tái)防止客戶端重復(fù)請(qǐng)求、提交表單實(shí)現(xiàn)原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12
Spring Boot Admin 環(huán)境搭建與基本使用詳解
這篇文章主要介紹了Spring Boot Admin 環(huán)境搭建與基本使用,本文主要是對(duì)于Spring Boot Admin的基本認(rèn)識(shí)和基本運(yùn)用,通過(guò)本篇博客能夠?qū)pring Boot Admin有一個(gè)宏觀認(rèn)知和能夠快速上手,需要的朋友可以參考下2023-08-08
Idea 自動(dòng)生成測(cè)試的實(shí)現(xiàn)步驟
當(dāng)我們?cè)趯懲暌恍┙涌诜椒ê笮枰獪y(cè)試時(shí),一個(gè)一個(gè)新建測(cè)試類比較麻煩 idea給我們提供了快捷辦法,本文主要介紹了Idea 自動(dòng)生成測(cè)試的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05
mybatis plus代碼生成工具的實(shí)現(xiàn)代碼
這篇文章主要介紹了mybatis plus代碼生成工具的實(shí)現(xiàn)代碼,需要的朋友可以參考下2021-04-04

