JAVA debug多线程程序

如果想对一段多线程程序进行debug,关键是在断点的设置上需要一些技巧。

如对于以下这段程序:

import java.lang.*;

class MyThread extends Thread{   //友好类,也可以在这个包内新建这段代码,不会出现访问权限问题
	public void run() {
		System.out.println("新线程开始运行");
		for(int i=1;i<20;i++)
			System.out.println("新线程循环:"+i);
		System.out.println("新线程运行结束");
	}
}

public class Demo{
	public static void main(String []arg) {
        MyThread t1=new MyThread();  //新建线程,所谓新建线程,其实就是新建一个Thread类的子类
        t1.start();  //新建与启动线程是不同的,需要用start()方法启动线程
        System.out.println("主线程开始运行");
		for(int i=1;i<10;i++)
			System.out.println("主线程循环:"+i);
        System.out.println("主线程结束");
	}
}

如果直接按F6进行debug,结果是这样的:


主线程开始运行

新线程开始运行

新线程循环:1

新线程循环:2

新线程循环:3

新线程循环:4

新线程循环:5

新线程循环:6

新线程循环:7

新线程循环:8

新线程循环:9

新线程循环:10

新线程循环:11

新线程循环:12

新线程循环:13

新线程循环:14

新线程循环:15

新线程循环:16

新线程循环:17

新线程循环:18

新线程循环:19

新线程运行结束

主线程循环:1

主线程循环:2

主线程循环:3

主线程循环:4

主线程循环:5

主线程循环:6

主线程循环:7

主线程循环:8

主线程循环:9

主线程结束

这是因为,在直接按F6进行单步调试时,相当于阻塞了主线程,调试指针指向t1.start();之后,开启了新线程,接着调试指针指向下一行时,主线程依然被阻塞,此时新线程很快会执行完毕,所以可以看到如上的执行结果(新线程直接循环结束,主线程还未开始循环部分)。

那么怎样才能正确debug多线程程序呢?我开始了几种尝试

  • 如果设置一个断点

如果在主线程中设置断点,结果和按F6单步调试没有任何差别。

那么在新线程中设置断点呢?

可以看到,这样是新线程被阻塞了,而主线程直接执行完毕,没有达到同时阻塞两个线程的目的!

  • 如果设置两个断点

在主线程与新线程中各设置一个断点,成功看到有两个线程被阻塞了,bingo!

  • 当然,也并不是非得多设几个断点才能有同时多个线程在运行,关键是要多搞出几个阻塞。
import java.lang.*;

class MyThread extends Thread{   //友好类,也可以在这个包内新建这段代码,不会出现访问权限问题
	public void run() {
		System.out.println(Thread.currentThread());
	}
}

public class Demo{
	public static void main(String []arg) {
        MyThread t1=new MyThread();  //新建线程,所谓新建线程,其实就是新建一个Thread类的子类
        MyThread t2=new MyThread();  //新建线程,所谓新建线程,其实就是新建一个Thread类的子类
        MyThread t3=new MyThread();  //新建线程,所谓新建线程,其实就是新建一个Thread类的子类
        MyThread t4=new MyThread();  //新建线程,所谓新建线程,其实就是新建一个Thread类的子类
        t1.start();
        t2.start();
        t3.start();
        t4.start();
	}
}

在MyThread类重写的run()方法中设置一个断点,就在这段程序中造成了4个阻塞,因此同时显示了四个线程,如图所示:

这样,只需要自己在Debug栏中自己选中任意线程,然后按F6,就可以手动控制线程的执行次序了! 

但是,我依然有一个问题:怎样才能使用Debug来调试程序、同时要能系统自动切换线程呢??

发布了29 篇原创文章 · 获赞 6 · 访问量 3410

猜你喜欢

转载自blog.csdn.net/qq_42138454/article/details/102633830