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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

try
                {
                        wait();
                }
                catch (InterruptedException i)
                {
                        System.out.println(Thread.currentThread().getName()+".....Exception");
                        flag = false;
                }
问题:1、当线程读到wait()时,是线程直接等待?还是抛出异常后等待?
2、当用interrupt();激活wait时,API文档里说interrupt()会抛出一个异常,那么总共应该就有两个异常了啊?
3、搜索了下,还不是太明白,是因为interrupt()不会产生异常,只是激活了原来wait的异常,所以总共是一个异常,而且还是wait抛出的,可对?

15 个回复

倒序浏览
我也不知道同求啊。
回复 使用道具 举报
来人啊~!
回复 使用道具 举报
。。。。。。。。无奈的感觉啊
回复 使用道具 举报
自学了几天java,怎么感觉java里满是让人无法理解的东西?怎么一点都不人性化呢??
回复 使用道具 举报
表示不明白
回复 使用道具 举报
志行 中级黑马 2015-5-26 11:23:36
7#
老夫来拯救你~~~~~
1.当线程读到wait()时,是线程直接等待?还是抛出异常后等待?
答:县城督导wait时是直接等待。  一般而言 在try{}  部分出现异常之后 会直接跳转到catch部分 后面的部分不执行,出现异常的部分也不会执行。
2、当用interrupt();激活wait时,API文档里说interrupt()会抛出一个异常,那么总共应该就有两个异常了啊?
interrupt()是 是 中断的线程重新激活,因为interrupt()启动的时候就是县城中断的时候 因此会抛出一个中断异常,可以在主函数上 throws(抛出)  并且在后面继续写try{}和 catch{}   或者   写 多个 catch();
3  第三个问题应该不用回答了吧~~~~~~感觉看了前两个应该可以明白了~~~~

回复 使用道具 举报
EastKK 中级黑马 2015-5-26 11:27:20
8#
志行 发表于 2015-5-26 11:23
老夫来拯救你~~~~~
1.当线程读到wait()时,是线程直接等待?还是抛出异常后等待?
答:县城督导wait时是直 ...

大神,求抱大腿,我表示懂了
回复 使用道具 举报
志行 发表于 2015-5-26 11:23
老夫来拯救你~~~~~
1.当线程读到wait()时,是线程直接等待?还是抛出异常后等待?
答:县城督导wait时是直 ...

1、会输出Exception是因为唤醒wait后,wait抛出的异常被解决了。这个理解了!
2、try       
                {t1.interrupt();}
        catch (SecurityException se)
                {System.out.println(Thread.currentThread().getName()+".....SecurityException");}
    在唤醒的时候还会产生异常,可以在主函数上抛出
     如果我不在主函数上抛,而是唤醒的时候直接try catch可以吧?
    那么按理说会打印.....SecurityException,但是结果没有打印,是不是说明interrupt没有抛出异常?
回复 使用道具 举报
表沉!表沉~
回复 使用道具 举报
我就是来学习的
回复 使用道具 举报
如果正确就读try里面的,否则就读抛出
回复 使用道具 举报
立志转行 发表于 2015-5-26 12:13
1、会输出Exception是因为唤醒wait后,wait抛出的异常被解决了。这个理解了!
2、try       
                {t1.interrupt() ...

是可以 catch的  没有 打印 可能是因为你的程序是不是木有异常 额  interrupt()  执行了吗~~~ 就是你上面的程序 是中断的吗?
回复 使用道具 举报
立志转行 发表于 2015-5-26 12:13
1、会输出Exception是因为唤醒wait后,wait抛出的异常被解决了。这个理解了!
2、try       
                {t1.interrupt() ...

就是说 在调用 t1.interrupt()之前   有没有t1.sleep() , 如果没有的话 t1.interrupt()是不会执行的,不执行 就没有异常 catch也没有执行 所以 不会输出~~~~~不知道是不知这个问题
回复 使用道具 举报
没太明白问什么
回复 使用道具 举报
本帖最后由 立志转行 于 2015-5-27 15:36 编辑

class StopThread implements Runnable
{
        private boolean flag = true;
        public synchronized void run()
        {
                while (flag)
                {
                        try
                        {
                                wait();
                        }
                        catch (InterruptedException i)
                        {
                                System.out.println(Thread.currentThread().getName()+".....Exception");
                                flag = false;
                        }
                        System.out.println(Thread.currentThread().getName()+".....run");
                }
        }
        public void changeFlag()
        {
                flag = false;
        }
}

class  StopThreadDemo
{
        public static void main(String[] args)
        {
                StopThread s = new StopThread();
                Thread t1 = new Thread(s);
                Thread t2 = new Thread(s);
                t1.start();
                t2.start();
                        int x = 0;
                while (true)
                {
                        if (x++ == 60)
                        {
                                //s.changeFlag();
                                try        
                                        {t1.interrupt();}
                                catch (SecurityException se)
                                        {System.out.println(Thread.currentThread().getName()+".....SecurityException");}
                                t2.interrupt();
                                break;
                        }
                        System.out.println(Thread.currentThread().getName()+"....."+x);
                        

                }
        }
}
这个完整的代码,看看那儿的不对。
interrupt()在唤醒的时候还会产生异常,可以在主函数上抛出
     如果我不在主函数上抛,而是唤醒的时候直接try catch可以吧?
    那么按理说会打印.....SecurityException,但是结果没有打印,是不是说明interrupt没有抛出异常?而是继续wait的异常,被上面Exception所解决?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马