abc01230123abc的gravatar头像
abc01230123abc 2016-03-29 13:34:54

java并发编程实战代码片段运行为什么没有抛出AssertionError异常?

最近在学习《java并发编程实战》这本书,看到一个代码片段,解释说这个类‘由于未被正确发布,因此这个类可能出现故障’(原话),我试着写了个多线程测试,但没有出现效果,先问下我这个测试是否写的正确,如果不正确,该怎样修改,能出现报错的效果,希望能帮忙,谢谢

原书上代码,预测会抛出AssertionError异常

public class Test01 {

	private int n;
	private Test01(int n){
		this.n = n;
	}	
	public void assertSanity(){
		if(n != n)
			throw new AssertionError("this statement is false");
	}
}

自己试着使用多线程测试修改的代码,增加了main方法

public class Test01 {

	private static int n;
	private Test01(int n){
		this.n = n;
	}
	
	public static void assertSanity(){
		if(n != n){
                        System.out.println("the statement is false");
                 }
	}
	
	public static void main(String[] args){	
		ExecutorService es = Executors.newFixedThreadPool(10);
		Test01 t = new Test01(4);
		es.execute(new Runnable(){

			@Override
			public void run() {
				while(true){
                                        System.out.println(new Date().getSeconds()+"---"+n);
					assertSanity();
				}
			}
			
		});
	}
	
}
所有回答列表(2)
han108的gravatar头像
han108  LV16 2016年3月30日

你首选判断一下是否开启了断言,

 public static void main(String[] args)
        {
            System.out.println("----start---");
            boolean isOpen = false;
            assert isOpen=true;             //如果开启了断言,会将isOpen的值改为true
            System.out.println("是否开启了断言"+isOpen);  //打印是否开启了断言
            if (isOpen)
            {
                int value=-1;
                assert 0 < value:"value="+value;
            }
            System.out.println("----end----");
        }

false表示没开启,在参数哪里加上-ea在运行试试

 

在你的代码基础上改了一下,你看是你想要的吗

public class Test01 {
    private static int n;
    private Test01(int n){
        this.n = n;
    }
    private Test01(){
        
    }
    public static void assertSanity(int n){
        assert n>n:"NOT";
                        System.out.println("false");
            throw new AssertionError("this statement is false");
    }
    
    public static void main(String[] args){    
        ExecutorService es = Executors.newFixedThreadPool(10);
        final Test01 t = new Test01();
        es.execute(new Runnable(){

            public void run() {
                while(true){
                    System.out.println(new Date().getSeconds()+"---"+n);
                    t.assertSanity(3);
                }
            }
            
        });
    }
    
}

评论(2) 最佳答案
何何何的gravatar头像
何何何  LV3 2016年3月31日

嗨,你好,你会ssm(springmvc)+ligerUI(或其他框架)开发一个后台管理平台吗,我是刚毕业,没啥经验,想做个,能帮忙吗,有些需求我们可以再说,谢谢您!

顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友