idea以任意顺序debug多线程程序的具体用法

目录
  • 1 debug 两类 Supspend
  • 2 按照顺序执行线程
  • 3 Condition的使用

在idea中使用debug可以让多个线程以任意顺序执行,先介绍一下基础知识,然后介绍具体做法。

1 debug 两类 Supspend

在断点处右键,可以看到Suspend分两类,一类是All,一类是Thread。当某个线程到达断点处会触发Suspend,All会使得所有线程都暂停,Thread只会使当前触发的线程暂停,其他线程不受影响。

在idea中使用debug可以让多个线程以任意顺序执行,先介绍一下基础知识,然后介绍具体做法。

以下面的代码为例,有3个MyThread线程以及一个主线程main。3个线程分别睡眠 1/2/3 秒,主线程睡眠 5 秒。下面分三种情况查看结果:

  1. 正常执行,执行完的顺序为 1, 2, 3, main
  2. 在断点1处打断点,设置为 All,在线程1触发后所有线程均暂停,可以通过Resume继续执行下一个断点,正常情况应该是3次Resume才能结束,但在有些时候idea会提示 skipped breakpoint at because it happened inside debugger evaluation,会跳过一些断点,这可能是ide本身的问题,可以在Settings->Build … ->Debugger->Data Views->Java中 取消 Enable ‘toString()' object view。
  3. 在断点1处打断点,设置为 Thread,3个子线程都会在断点处暂停,main线程没有暂停,会先执行完。
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()+"断点之间执行");
            System.out.println(Thread.currentThread().getName()+"断点2"); //断点2
        }
    }

2 按照顺序执行线程

在子线程打两个Thread断点,通过Frames控制子线程的执行顺序,假设断点之间的执行顺序为3, 2, 1, 2, 1, 3。其中第一次执行从断点1开始,执行到断点2之前,第二次执行会执行断点2并结束。

如果感觉不好理解,可以将MyThread换成三个不同的类分别对应三个线程,在三个类中分别打断点。这里我不再替换。

debug运行,稍等一会,三个线程都会到第一个断点停下,此时未有任何输出,注意在左下角Frames的菜单,点开,会发现三个线程都在Frames内,这说明三个线程都已经暂停,有时候下拉框会有main,但其实main不会暂停。

想先执行Thread 3,则在下拉框选择Thread 3,点一下Resume,此时Thread 3的第一个断点和断点之间的代码执行,Thread 3暂停在第二个断点上,其他暂停的线程不受影响。

对应的后续执行顺序是,切换到Thread 2/1/2/1/3,每次切换都Resume一次。

总结:想让哪个线程先执行就在下拉框切换到相应的线程,并Resume,则该线程执行到下一个断点,如果没有下一个断点则会一直执行直到结束。此时,其他暂停的线程会一直暂停等待。

这样的做法可以推广到多个线程,对于需要暂停的线程都打上断点即可,每个线程可以打多个,方便控制执行顺序。对于不需要暂停的线程可以不打断点,就像这里的main线程一样。

3 Condition的使用

另外如果只想让某个线程在断点处停止,可以使用断点的Condition,如上面的代码中只想让第一个线程暂停,则可以在断点处右键,在Condition中填入Thread.currentThread().getName().equals(“Thread 1”);

到此这篇关于idea以任意顺序debug多线程程序的文章就介绍到这了,更多相关idea多线程debug内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • idea 无法debug调试的解决方案

    使用idea 调试模式运行项目是启动不了,本人亲自测试有效使用 报错信息如下 C:\tomcat路径\apache-tomcat-8.5.40\bin\catalina.bat run [2019-04-19 10:53:53,796] Artifact agro_examina: Waiting for server connection to start artifact deployment... Using CATALINA_BASE: "C:\Users\Administrator\.

  • 在IntelliJ IDEA中多线程并发代码的调试方法详解

    通常来说,多线程的并发及条件断点的debug是很难完成的,或许本篇文章会给你提供一个友好的调试方法.让你在多线程开发过程中的调试更加的有的放矢. 我们将通过一个例子来学习.在这里,我编写了一个多线程程序来计算此数学问题:100! + 100000!.即:100的阶乘 + 100000的阶乘. 数学不好的同学看这里,100 阶乘就是:1 * 2 * 3 * -- * 100 = ? ,简写为100! import java.math.BigInteger; public class MathPro

  • Tomcat使用IDEA远程Debug调试的讲解

    Tomcat运行环境:CentOS6.5.Tomcat7.0.IDEA 远程Tomcat设置 1.在tomcat/bin下的catalina.sh上边添加下边的一段设置 CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=60222,suspend=n,server=y" 2.address=60222 这个是后边IDEA设置的时候需要用到的调试端口,可以任意设置一个未使用的端口,但是后边的配置都要一致. IDEA设

  • IDEA多线程文件下载插件开发的步骤详解

    上周使用Java开发了大文件多线程下载工具类,自己平时的文件下载也在使用这个工具,下载速度确实提升不少,但是每次下载都要去打开项目运行代码,觉得实在不是很方便:考虑到每天我们都会使用到IDEA开发工具,所以就决定把这个下载工具做成IDEA的插件,文章末尾附上插件下载地址. Java实现大文件多线程下载 Gitee地址: https://gitee.com/silently9527/fast-download IDEA多线程文件下载插件 Github地址: https://github.com/s

  • 你不知道的 IDEA Debug调试小技巧(小结)

    一.多线程调试断点 Intellij IDEA 的debug断点调试是有一个模式的选择的,就像下面这张图,平时我们都使用的是默认的 ALL(在Eclipse中默认是线程模式) ,这种模式我们只能将一个线程断下来,但其他线程却已经执行过了:而将其改为 Thread 后,就可以多个线程都断下来,并且可以很方便的切换线程的执行流程,这就是多线程调试. 在debug控制台能够很方便的查看线程的执行状态,也可以很方便的选择某个线程去执行: 二.回退断点 不知道大伙有没有遇到这样一个问题,当我们进行debu

  • idea以任意顺序debug多线程程序的具体用法

    目录 1 debug 两类 Supspend 2 按照顺序执行线程 3 Condition的使用 在idea中使用debug可以让多个线程以任意顺序执行,先介绍一下基础知识,然后介绍具体做法. 1 debug 两类 Supspend 在断点处右键,可以看到Suspend分两类,一类是All,一类是Thread.当某个线程到达断点处会触发Suspend,All会使得所有线程都暂停,Thread只会使当前触发的线程暂停,其他线程不受影响. 在idea中使用debug可以让多个线程以任意顺序执行,先介

  • Windows下使用Dev-C++开发基于pthread.h的多线程程序实例

    一.下载Windows版本的pthread 目前最新版本是:pthreads-w32-2-9-1-release.zip. 二.解压pthread到指定目录 我选择的目录是:E:\DEV-CPP\Pthread 完成后,该目录会多出三个文件夹:Pre-built.2,pthreads.2,QueueUserAPCEx. 三.配置Dev-C++编译选项 1)点击"工具"→"编译选项"→"目录"→"c++包含文件",浏览到刚才解压

  • 浅谈Java文件执行顺序、main程序入口的理解

    在我们通过JVM编译Java后缀名的文件时,JVM首先寻找入口(main方法) public static void main(String[] args) 1.由于在入口时,未调用任何对象,该方法只能设置为static静态 2.JVM为Java的最底层,所以即使有返回结果,结果也无处可去,因此该方法必然是void无返回值 3.由于main方法是入口,被JVM自动调用,只有将该方法设置为public公有级别才能对JVM可见 综上,入口main方法只能写为 public static void m

  • spyder 在控制台(console)执行python文件,debug python程序方式

    执行: 在IPython console里先cd到test.py所在的文件夹,再run test.py.注意使用的是命令run 而不是命令python. debug: 栗子: debugfile('/home/1/tensor2tensor/tensor2tensor/bin/t2t-datagen', args='--problem=image_mnist --data_dir=~/t2t_data --tmp_dir=~/t2t_data/tmp',wdir='/home/1/tensor2

  • 详解在Java中如何创建多线程程序

    创建多线程程序的第一种方式:创建Thread类的子类 java.lang.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类 实现步骤: 1.创建一个Thread类的子类 2.在Thread类的子类中重写Thread类中的run方法,设置线程任务(开启线程要做什么?) 3.创建Thread类的子类对象 4.调用Thread类中的方法start方法,开启新的线程,执行run方法 void start()使该线程开始执行;Java虚拟机调用该线程的run方法. 结果是两

  • 创建java多线程程序

    目录 创建多线程程序的第一种方式:创建Thread类的子类 实现步骤: 创建多线程程序的第二种方式:实现RunnabLe接口 java.Lang.Thread类的构造方法 实现步骤: 实现Runnable接口创建多线程程序的好处: 匿名内部类方式实现线程的创建 Thread类中的常用方法: 获取线程的名称: 设置线程的名称:(了解) 总结: 创建多线程程序的第一种方式:创建Thread类的子类 java.lang.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类

  • Python编程之顺序执行与程序的主入口详解

    目录 前言 1.顺序执行(了解) 2.程序主入口(熟悉) 总结 前言 本章将会讲解Python编程中的顺序执行与程序的主入口. 1.顺序执行(了解) Python代码在执行过程中,遵循下面的基本原则: 普通语句,直接执行: 碰到函数,将函数体载入内存,并不直接执行 碰到类,执行类内部的普通语句,但是类的方法只载入,不执行 碰到if.for等控制语句,按相应控制流程执行 碰到@,break,continue等,按规定语法执行 碰到函数.方法调用等,转而执行函数内部代码,执行完毕继续执行原有顺序代码

  • C#多线程TPL模式高级用法探秘

    一.引言 我们先来看下面的一个小示例:一个Winfrom程序,界面上有一个按钮,有两个异步方法,点击按钮调用两个异步方法,弹出执行顺序,代码如下: using System; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace TPLDemoSln { public partial class Form1 : Form { public Form1() { Init

  • C#简单多线程同步和优先权用法实例

    本文实例讲述了C#简单多线程同步和优先权用法.分享给大家供大家参考.具体分析如下: 本文实例题目如下: 麦当劳有两个做汉堡的厨师(工号:11,12)和三个销售人员(工号:21,22,23). 厨师生产汉堡,并负责将做好的汉堡放入货架,货架台大小有限,最多放6个汉堡,11和12不能同时往货架台上放汉堡,11具有优先权. 销售人员负责销售食品,三个销售人员取食品时,货架不能为空,三人不能同时取,23优先权最高,21最低.21卖的最快,取得频率最高,22次之. 一天的工作量是销售70个汉堡. 这里先来

  • 微信小程序Flex布局用法深入浅出分析

    本文实例讲述了微信小程序Flex布局用法.分享给大家供大家参考,具体如下: Flex布局: Flexible Box的缩写,意为"弹性布局",为盒模型提供巨大的灵活性 使用说明: 1. 任何容器都可以使用flex布局 .box { display: flex; } 2.行内元素可以使用flex布局 .box{ display: inline-flex; } 3.webkit内核的浏览器,要加上-webkit前缀 .box { display: -webkit-flex; /* Safa

随机推荐