黑马程序员技术交流社区

标题: 两线程交替执行疑问??? [打印本页]

作者: 崔朋朋    时间: 2012-9-21 16:23
标题: 两线程交替执行疑问???
本帖最后由 崔朋朋 于 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,则应该报异常。
但多次反复执行,都没有报异常报出,是在怎么回事?     






作者: 彭润生    时间: 2012-9-21 16:46
本帖最后由 彭润生 于 2012-9-21 16:50 编辑

你的主函数上面抛出了异常。

作者: 崔朋朋    时间: 2012-9-21 17:02
sorry     写程序时主函数抛异常习惯了。      但即便把主函数的throws exception去掉 ,执行多次还是没有报出异常啊?       问题已重新编辑
作者: 刘圣伟    时间: 2012-9-21 18:14
去查查api,没有线程wait,也不会报异常的。

IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2