A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王新年 中级黑马   /  2014-1-7 16:27  /  907 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

运行时怎么和张老师的运行结果不同啊?求助
package cn_heima_Thread;

import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CountDownLatchTest {

        /**
         * @param args
         */
        public static void main(String[] args) {
                // TODO 自动生成的方法存根
                ExecutorService ex=Executors.newCachedThreadPool();
                final CountDownLatch countdownlatch=new CountDownLatch(1);
                final CountDownLatch countdownlatch1=new CountDownLatch(3);
                for(int i=0;i<3;i++){
                        Runnable runnable=new Runnable(){
                                public void run(){
                                        System.out.println("线程"+Thread.currentThread().getName()+"开始等待首长发布命令!");
                                        try {
                                                countdownlatch.await();
                                        } catch (InterruptedException e) {
                                                // TODO 自动生成的 catch 块
                                                e.printStackTrace();
                                        }
                                        System.out.println("线程"+Thread.currentThread().getName()+"收到命令!");
                                        try {
                                                Thread.sleep(new Random().nextInt(10)*1000);
                                        } catch (InterruptedException e) {
                                                // TODO 自动生成的 catch 块
                                                e.printStackTrace();
                                        }
                                        System.out.println("线程"+Thread.currentThread().getName()+"已经跑到终点");
                                        countdownlatch1.countDown();
                                }
                        };
                        ex.execute(runnable);
                }
                try {
                        Thread.sleep(10000);
                } catch (InterruptedException e1) {
                        // TODO 自动生成的 catch 块
                        e1.printStackTrace();
                }
                System.out.println("首长开始发布命令");
                countdownlatch.countDown();
                System.out.println("首长已经发布!正在等候");
                try {
                        countdownlatch1.wait();
                } catch (InterruptedException e) {
                        // TODO 自动生成的 catch 块
                        e.printStackTrace();
                }
                System.out.println("首长最终收到命令!");
               

        }

}



求技术分

1 个回复

倒序浏览
问题1,其实你可以在错误框弹出时,将被调试程序中断到调试器(在WinDBG中按Ctrl+Break,在VC菜单中选Break),然后观察每个线程的栈回溯。上面这个错误应该是同步的,所以应该可以从栈回溯中看到线索。
问题2,这个运行期错应该就是运行库检查到不合适的用法后,直接弹出错误框,我推测它就是个普通的:
if(something error)
{
msgbox(...);
}
根本没有异常发生。当然,报告运行期错误的过程要经历很多步骤(参考《软件调试》的清单21-12)。
问题3,对于这个问题在错误框弹出时,做DUMP来得及,打开DUMP后,首先设置好符号后,可以使用~* kPL命令来显示各个线程的栈回溯,然后找到错误框所在的线程,分析其来龙去脉。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马