您好,登錄后才能下訂單哦!
這篇文章主要介紹了idea如何以任意順序debug多線程程序,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
在斷點處右鍵,可以看到Suspend分兩類,一類是All,一類是Thread。當某個線程到達斷點處會觸發(fā)Suspend,All會使得所有線程都暫停,Thread只會使當前觸發(fā)的線程暫停,其他線程不受影響。
在idea中使用debug可以讓多個線程以任意順序執(zhí)行,先介紹一下基礎(chǔ)知識,然后介紹具體做法。
以下面的代碼為例,有3個MyThread線程以及一個主線程main。3個線程分別睡眠 1/2/3 秒,主線程睡眠 5 秒。下面分三種情況查看結(jié)果:
正常執(zhí)行,執(zhí)行完的順序為 1, 2, 3, main
在斷點1處打斷點,設(shè)置為 All,在線程1觸發(fā)后所有線程均暫停,可以通過Resume繼續(xù)執(zhí)行下一個斷點,正常情況應(yīng)該是3次Resume才能結(jié)束,但在有些時候idea會提示 skipped breakpoint at because it happened inside debugger evaluation,會跳過一些斷點,這可能是ide本身的問題,可以在Settings->Build … ->Debugger->Data Views->Java中 取消 Enable ‘toString()' object view。
在斷點1處打斷點,設(shè)置為 Thread,3個子線程都會在斷點處暫停,main線程沒有暫停,會先執(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()+"斷點1"); //斷點1 System.out.println(Thread.currentThread().getName()+"斷點之間執(zhí)行"); System.out.println(Thread.currentThread().getName()+"斷點2"); //斷點2 } }
在子線程打兩個Thread斷點,通過Frames控制子線程的執(zhí)行順序,假設(shè)斷點之間的執(zhí)行順序為3, 2, 1, 2, 1, 3。其中第一次執(zhí)行從斷點1開始,執(zhí)行到斷點2之前,第二次執(zhí)行會執(zhí)行斷點2并結(jié)束。
如果感覺不好理解,可以將MyThread換成三個不同的類分別對應(yīng)三個線程,在三個類中分別打斷點。這里我不再替換。
debug運行,稍等一會,三個線程都會到第一個斷點停下,此時未有任何輸出,注意在左下角Frames的菜單,點開,會發(fā)現(xiàn)三個線程都在Frames內(nèi),這說明三個線程都已經(jīng)暫停,有時候下拉框會有main,但其實main不會暫停。
想先執(zhí)行Thread 3,則在下拉框選擇Thread 3,點一下Resume,此時Thread 3的第一個斷點和斷點之間的代碼執(zhí)行,Thread 3暫停在第二個斷點上,其他暫停的線程不受影響。
對應(yīng)的后續(xù)執(zhí)行順序是,切換到Thread 2/1/2/1/3,每次切換都Resume一次。
總結(jié):想讓哪個線程先執(zhí)行就在下拉框切換到相應(yīng)的線程,并Resume,則該線程執(zhí)行到下一個斷點,如果沒有下一個斷點則會一直執(zhí)行直到結(jié)束。此時,其他暫停的線程會一直暫停等待。
這樣的做法可以推廣到多個線程,對于需要暫停的線程都打上斷點即可,每個線程可以打多個,方便控制執(zhí)行順序。對于不需要暫停的線程可以不打斷點,就像這里的main線程一樣。
另外如果只想讓某個線程在斷點處停止,可以使用斷點的Condition,如上面的代碼中只想讓第一個線程暫停,則可以在斷點處右鍵,在Condition中填入Thread.currentThread().getName().equals(“Thread 1”);
感謝你能夠認真閱讀完這篇文章,希望小編分享的“idea如何以任意順序debug多線程程序”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。