如果想对一段多线程程序进行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来调试程序、同时要能系统自动切换线程呢??