最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

idea以任意順序debug多線程程序的具體用法

 更新時間:2021年08月30日 10:41:44   作者:Java與大數(shù)據(jù)進(jìn)階  
在idea中使用debug可以讓多個線程以任意順序執(zhí)行,接下來通過本文給大家介紹idea以任意順序debug多線程程序的具體用法,需要的朋友參考下吧

在idea中使用debug可以讓多個線程以任意順序執(zhí)行,先介紹一下基礎(chǔ)知識,然后介紹具體做法。

1 debug 兩類 Supspend

在斷點(diǎn)處右鍵,可以看到Suspend分兩類,一類是All,一類是Thread。當(dāng)某個線程到達(dá)斷點(diǎn)處會觸發(fā)Suspend,All會使得所有線程都暫停,Thread只會使當(dāng)前觸發(fā)的線程暫停,其他線程不受影響。

在idea中使用debug可以讓多個線程以任意順序執(zhí)行,先介紹一下基礎(chǔ)知識,然后介紹具體做法。

在這里插入圖片描述

以下面的代碼為例,有3個MyThread線程以及一個主線程main。3個線程分別睡眠 1/2/3 秒,主線程睡眠 5 秒。下面分三種情況查看結(jié)果:

  1. 正常執(zhí)行,執(zhí)行完的順序?yàn)?1, 2, 3, main
  2. 在斷點(diǎn)1處打斷點(diǎn),設(shè)置為 All,在線程1觸發(fā)后所有線程均暫停,可以通過Resume繼續(xù)執(zhí)行下一個斷點(diǎn),正常情況應(yīng)該是3次Resume才能結(jié)束,但在有些時候idea會提示 skipped breakpoint at because it happened inside debugger evaluation,會跳過一些斷點(diǎn),這可能是ide本身的問題,可以在Settings->Build … ->Debugger->Data Views->Java中 取消 Enable ‘toString()' object view。
  3. 在斷點(diǎn)1處打斷點(diǎn),設(shè)置為 Thread,3個子線程都會在斷點(diǎn)處暫停,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()+"斷點(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í)行線程

在子線程打兩個Thread斷點(diǎn),通過Frames控制子線程的執(zhí)行順序,假設(shè)斷點(diǎn)之間的執(zhí)行順序?yàn)?, 2, 1, 2, 1, 3。其中第一次執(zhí)行從斷點(diǎn)1開始,執(zhí)行到斷點(diǎn)2之前,第二次執(zhí)行會執(zhí)行斷點(diǎn)2并結(jié)束。

如果感覺不好理解,可以將MyThread換成三個不同的類分別對應(yīng)三個線程,在三個類中分別打斷點(diǎn)。這里我不再替換。

debug運(yùn)行,稍等一會,三個線程都會到第一個斷點(diǎn)停下,此時未有任何輸出,注意在左下角Frames的菜單,點(diǎn)開,會發(fā)現(xiàn)三個線程都在Frames內(nèi),這說明三個線程都已經(jīng)暫停,有時候下拉框會有main,但其實(shí)main不會暫停。

在這里插入圖片描述

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

在這里插入圖片描述

對應(yīng)的后續(xù)執(zhí)行順序是,切換到Thread 2/1/2/1/3,每次切換都Resume一次。

總結(jié):想讓哪個線程先執(zhí)行就在下拉框切換到相應(yīng)的線程,并Resume,則該線程執(zhí)行到下一個斷點(diǎn),如果沒有下一個斷點(diǎn)則會一直執(zhí)行直到結(jié)束。此時,其他暫停的線程會一直暫停等待。

這樣的做法可以推廣到多個線程,對于需要暫停的線程都打上斷點(diǎn)即可,每個線程可以打多個,方便控制執(zhí)行順序。對于不需要暫停的線程可以不打斷點(diǎn),就像這里的main線程一樣。

3 Condition的使用

另外如果只想讓某個線程在斷點(diǎn)處停止,可以使用斷點(diǎn)的Condition,如上面的代碼中只想讓第一個線程暫停,則可以在斷點(diǎn)處右鍵,在Condition中填入Thread.currentThread().getName().equals(“Thread 1”);

在這里插入圖片描述

到此這篇關(guān)于idea以任意順序debug多線程程序的文章就介紹到這了,更多相關(guān)idea多線程debug內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

昌黎县| 武鸣县| 佛山市| 曲阜市| 远安县| 若尔盖县| 汾阳市| 波密县| 茂名市| 洪泽县| 噶尔县| 浦江县| 阜城县| 苍南县| 沙洋县| 远安县| 萨迦县| 温州市| 东安县| 定西市| 郎溪县| 兰溪市| 锦州市| 平顺县| 恩平市| 广安市| 建瓯市| 南投县| 延庆县| 桂东县| 东阳市| 忻城县| 牡丹江市| 浪卡子县| 乐清市| 海晏县| 重庆市| 博湖县| 罗源县| 祁门县| 遵义市|