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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 崔朋朋 中级黑马   /  2012-9-21 16:23  /  1626 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 崔朋朋 于 2012-9-21 17:39 编辑

//子线程循环5次,主线程循环10次,接着又到子线程循环5次,接着又到主线程循环10次,如此反复50次
public class TraditionalThreadComunication {

        public static void main(String[] args){
                final Business business = new Business();
                // 子线程
                new Thread(new Runnable() {
                        @Override
                        public void run() {
                                for (int i = 1; i <= 50; i++) {
                                        try {
                                                business.sub(i);
                                        } catch (Exception e) {
                                                e.printStackTrace();
                                        }
                                }
                        }
                }).start();

                // 主线程
                new Thread(new Runnable() {
                        @Override
                        public void run() {
                                for (int i = 1; i <= 50; i++) {
                                        try {
                                                business.main(i);
                                        } catch (Exception e) {
                                                e.printStackTrace();
                                        }
                                }
                        }
                }).start();
        }
}

class Business {
        // sub与main已经互斥了
        private boolean bShouldSub = true;

        public synchronized void sub(int i) throws Exception {
                //若不是子线程,则子线程wait
                while (!bShouldSub) {
                        this.wait();
                }

                for (int j = 1; j <= 5; j++) {
                        System.out.println("sub: " + j + " loop: " + i);
                }
                bShouldSub = false;
                this.notify();
        }

        public synchronized void main(int i) throws Exception {      
                //若是子线程,则主线程wait
                while (bShouldSub) {
                        this.wait();
                }

                for (int j = 1; j <= 10; j++) {
                        System.out.println("main: " + j + " loop: " + i);
                }
                bShouldSub = true;
                this.notify();
        }
}

我的问题是:  
两个线程谁先执行不一定,但如果先执行子线程的business.sub(i);则执行到this.notify();发现没有线程wait,则应该报异常。
但多次反复执行,都没有报异常报出,是在怎么回事?     





评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

3 个回复

倒序浏览
本帖最后由 彭润生 于 2012-9-21 16:50 编辑

你的主函数上面抛出了异常。
回复 使用道具 举报
sorry     写程序时主函数抛异常习惯了。      但即便把主函数的throws exception去掉 ,执行多次还是没有报出异常啊?       问题已重新编辑
回复 使用道具 举报
去查查api,没有线程wait,也不会报异常的。

IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马