0 0

debug时观察到值不一致问题30

package demo.task;

public class Test implements Runnable{
	public static void main(String[] args) throws Exception {
		Thread thread = new Thread(new Test());
		thread.start();
		Thread.sleep(4000);
		thread.interrupt();
		if(thread.isInterrupted()){
			System.out.println("interreput 1");
		}
	}

	@Override
	public void run() {
		boolean isinterreput = Thread.currentThread().isInterrupted();
		if(isinterreput){
			System.out.println("interreput 2");
		}
	}
}

我在eclipse中调试以上代码,在第八行与第十六行分别设置了两个断点,然后开始从第八行单步执行到第九行,这时我在debug窗口中切换线程到在main函数中新建的thread线程中继续执行,也就是从第十六行开始单步执行到十九行,这时我在表达式窗口查看Thread.currentThread().isInterrupted()表达式的值为false(我感觉这不对啊),然后我继续执行程序打印了interreput 2这说明Thread.currentThread().isInterrupted()表达式的值是true啊,为什么在表达式窗口看到的值与实际的执行值不一样啊?望大家给于指点

问题补充:这只是模拟程序,真实的程序中如果要对中断做出响应当然要判断现在的中断状态
,只是要用interrupted()而已,但是用这个会把状态清除,所以我用了isInterrupted


kidding87 写道
Thread.currentThread().isInterrupted();
指的是是否被中断,true表示被中断了,false表示,没有你是理解反了。
断点如果打在run里面在debug的时候是可以看到这里是true,表示被中断了
而且在自己run的是否去判断自己是否中断,你不觉得很没意思么。。。


问题补充:你是像我说的单步执行的吗,如果直接运行的话是不会出的

niepeng880208 写道
你执行了Thread.currentThread().isInterrupted(); 线程已经断开了, 返回值肯定是false, 至于你说你能打印出interreput 2, 我不知道, 你的代码我执行了,在我这里没有打印出来任何值…


问题补充:我也是这样怀疑的,但是如果不一致的话,应该在表达式窗口与实际运行的值都是错的才是啊,怎么运行的结果对,但是看到的不对啊
kidding87 写道
还有debug其实就是中断线程,进去拿数据而已,所有debug可能导致程序的结果不一样


问题补充:是两个线程都中断了,我知道啊,不是说了吗,先执行main线程一步,再执行thread的线程一步,在表达式窗口看Thread.currentThread()是thread线程啊
kidding87 写道
我上面是回的楼上的那个人的

你这里打断点事打在了两个线程上面
Main线程和 Test上面

我截了个图片,你可以看到这两个线程都被中断了

从第十六行开始单步执行到十九行,这时我在表达式窗口查看Thread.currentThread().isInterrupted()表达式的值为false(我感觉这不对啊)

Thread.currentThread()在表达式窗口你可以看看这个是什么线程

2012年4月26日 11:48

10个答案 按时间排序 按投票排序

0 0

Thread.sleep(4000);   这里主线程在睡觉的时候,子线程已经跑完了。。 然后你在用子线程的引用来interrupted,肯定不会有反应啦

2012年5月09日 09:05
0 0

我感觉 Debug 的监视变量是一个新的线程里执行表达式,而不是你的被暂停的线程。
因此,
Thread.currentThread().isInterrupted()看的不是你的线程……

判断方法:
Thread th = Thread.currentThread();
然后你看看 th.getId();
和Thread.currentThread().getId();

2012年5月08日 11:51
0 0

2012年5月03日 13:41
0 0

我觉得首先你要明白代码的意思,对线程的理解。
main函数里实际有两个线程,
线程1:Thread thread = new Thread(new Test()); 
                //调用Test的run()方法 
                 
        thread.start(); 
        thread.run();
线程2: // 加上下面这句,可以看到thread的情况
System.out.println(thread.isAlive());

// 这里是指主线程sleep 4 秒
Thread.sleep(4000);

// 主线程休息完4秒后,中断thread进程
thread.interrupt();
// 判断thread是否被中断,已经跑完的thread是不会被中断的
if (thread.isInterrupted()) {
System.out.println("interreput 1");

既然是两个线程,是同时执行的。不一定哪个先执行。debug模式下可以选择是哪个线程先执行。所以会出现你所说的现象。并不是值不一样,是根本不是一个线程

2012年4月28日 10:27
0 0

我上面是回的楼上的那个人的

你这里打断点事打在了两个线程上面
Main线程和 Test上面

我截了个图片,你可以看到这两个线程都被中断了

从第十六行开始单步执行到十九行,这时我在表达式窗口查看Thread.currentThread().isInterrupted()表达式的值为false(我感觉这不对啊)

Thread.currentThread()在表达式窗口你可以看看这个是什么线程

2012年4月26日 13:30
0 0

Thread.currentThread().isInterrupted();
指的是是否被中断,true表示被中断了,false表示,没有你是理解反了。
断点如果打在run里面在debug的时候是可以看到这里是true,表示被中断了
而且在自己run的是否去判断自己是否中断,你不觉得很没意思么。。。

2012年4月26日 12:45
0 0


@Override
public void run() {
                 //当前线程是否被中断
                //这里并没有中断
boolean isinterreput = Thread.currentThread().isInterrupted();
if(isinterreput){
System.out.println("interreput 2");
}
               //注意这里run完成之后,thread就结束了
}
}

LS意思是isinterreput 得到的false是因为LZ用了debug模式跑程序了?
那如果不debug 那个值返回的是会是true吗?

2012年4月26日 12:36
0 0

还有debug其实就是中断线程,进去拿数据而已,所有debug可能导致程序的结果不一样

2012年4月26日 12:25
0 0

package demo.task;
//实现runnable
public class Test implements Runnable{
	public static void main(String[] args) throws Exception {
		Thread thread = new Thread(new Test());
                //调用Test的run()方法
                
		thread.start();
                //此时thread已经run完了
                
                //加上下面这句,可以看到thread的情况
                 System.out.println(thread.isAlive());

                //这里是指主线程sleep 4 秒
		Thread.sleep(4000);

                //主线程休息完4秒后,中断thread进程
		thread.interrupt();
                //判断thread是否被中断,已经跑完的thread是不会被中断的
		if(thread.isInterrupted()){
			System.out.println("interreput 1");
		}
	}

	@Override
	public void run() {
                 //当前线程是否被中断
                //这里并没有中断
		boolean isinterreput = Thread.currentThread().isInterrupted();
		if(isinterreput){
			System.out.println("interreput 2");
		}
               //注意这里run完成之后,thread就结束了
	}
}

2012年4月26日 12:21
0 0

你执行了Thread.currentThread().isInterrupted(); 线程已经断开了, 返回值肯定是false, 至于你说你能打印出interreput 2, 我不知道, 你的代码我执行了,在我这里没有打印出来任何值…

2012年4月26日 12:12

相关推荐

    debugLog日志

    当程序运行出现问题时,debug日志能够提供详细的执行流程和变量状态信息,以便于开发者追踪代码执行路径,定位问题所在。通过观察debug日志,我们可以看到函数调用的顺序、变量的赋值变化以及可能出现异常的地方。 ...

    eclipse中debug技巧

    在调试过程中,如果遇到传入的变量值不正确的情况,可以通过Eclipse直接修改变量的值,以观察不同的执行路径。 1. **修改变量值**:在Debug视图的Variables面板中找到需要修改的变量,右键选择“Change Value”,...

    调试用的工具JSdebug

    例如,IE的兼容性问题众所周知,而JSdebug能够帮助开发者在IE中调试代码,找出与标准浏览器行为不一致的地方。 在实际使用中,你可能需要了解如何在这些浏览器中启用JSdebug工具。在IE中,通常需要打开开发者工具...

    Atom-haskell-debug,使用ghci在atom中实现图形haskell调试器.zip

    7. **跨平台支持**:Atom-Haskell-Debug适用于Windows、MacOS和Linux等多操作系统,确保开发者在不同环境下都能享受一致的调试体验。 为了开始使用Atom-Haskell-Debug,你需要先安装Atom编辑器,然后通过Atom的包...

    idea - debug 高级技巧.pdf

    当我们更改变量的值时,Idea会自动更新变量的值,以便我们可以在调试过程中实时地观察变量的变化。 五、计算表达式 计算表达式是Idea中的一个功能强大的功能,它可以帮助我们在调试过程中计算某个表达式的值。我们...

    串口通信程序源码1.0Debug版

    1. 16个通道间切换有问题:这可能意味着在程序中切换到不同的数据通道时,出现了错误或者不稳定的情况。可能的原因包括通道管理逻辑的缺陷、资源释放不完全、或者是串口重置操作没有正确执行。解决这个问题需要深入...

    最全 java23种设计模式 Debug模式+内存分析

    根据提供的文件标题、描述、标签以及部分内容链接,我们可以推断出这篇文章主要关注的是Java中的23种设计模式,并且还涉及到了Debug模式和内存分析的相关内容。下面将围绕这些核心主题进行详细的阐述。 ### Java 23...

    debug 命令详细解说 用命令集

    - **应用场景**:观察和修改程序运行时寄存器状态。 ##### 15. s (Search) - **命令格式**:`s range list` - **功能**:搜索内存范围内的字节序列。 - **参数**: - `range`:搜索的内存范围。 - `list`:要...

    VisualStudio2005C++Debug共15页

    【Visual Studio 2005 C++ Debug 技术详解】 Visual Studio 2005是微软公司推出的集成开发环境(IDE),对于C++开发者来说,它提供了强大的调试工具,帮助程序员定位并修复代码中的错误。这篇15页的文档详细介绍了...

    webgl公用函数库(cuon-matrix.js,cuon-utils.js,webgl-debug.js,webgl-utils.js)

    webgl-debug.js提供了一些调试工具,如检查上下文错误、打印出错信息、验证着色器编译状态等,帮助开发者更好地找出问题所在,提升调试效率。这对于优化WebGL应用程序和确保其在不同设备上表现一致至关重要。 4. ...

    debug_data

    2. **数据预处理**:检查数据质量,处理缺失值、异常值或不一致的数据,这可能会暴露出代码的潜在问题。 3. **代码执行与断点设置**:在可能出错的代码段设置断点,使用调试器逐步执行,观察变量的状态变化。 4. **...

    Hybris在idea中debug配置方法详解

    `Port`字段是关键,确保它与你在启动`hybrisserver.bat debug`时指定的端口一致。默认情况下,Hybris使用的是5005端口,但如果你有特殊需求,可以自行更改。 配置完成后,点击`Apply`,然后`OK`保存设置。现在,你...

    A10_FPGA在线调试说明_v1.001

    《A10 FPGA在线调试说明_v1.001》文档详细阐述了FPGA开发中的在线调试步骤,这对于解决FPGA上板后出现的行为不一致问题至关重要。在FPGA开发中,由于上板调试手段有限,往往使得错误定位变得困难。Xilinx的下载线...

    Debug.Hacks中文版_深入调试的技术和工具.pdf

    - **数据不一致**:多线程环境下数据同步失败。 #### 定位方法 - **使用调试工具提供的功能**:如查看内存、寄存器状态等。 - **分析日志文件**:查找异常发生的时间点及相关信息。 - **复现问题**:尝试模拟故障...

    19020011038-岳宇轩-汇编实验11

    1. 执行T命令时,观察到IP和AX寄存器的变化,以理解指令执行的影响。 2. 修改IP后,使用G命令运行程序,观察程序流程的改变。 3. 编写的自定义程序实现了字符串的复制,通过D命令验证DS:100和ES:200处的数据一致性。...

    LATTICE在線調試

    3. **数据位宽一致性**:编写Verilog代码时务必确保各信号的数据位宽一致,否则可能会导致Reveal工具无法正常工作。 通过上述详尽的指导,您可以有效地利用Diamond 3.8环境下的RevealAnalyzer进行在线调试,从而...

    VC++程序调试 VC++程序调试

    - 多线程内存冲突:不同线程共享资源时未正确同步,造成数据不一致。 - 内存越界:例如字符串或内存拷贝操作超出边界。 - 窗口消息顺序问题:窗口状态未初始化时处理消息可能导致问题。 - **定位错误**: - ...

    vc调试方法大全.pdf

    - 通过观察变量值和调用堆栈来理解程序执行流程。 - 高级断点设置允许设置条件断点和数据断点,只在满足特定条件时暂停。 3. 异常调试: - 当遇到异常时,可以尝试重试、取消操作,然后通过调用堆栈和变量窗口...

Global site tag (gtag.js) - Google Analytics