请教大家一个问题题目:
子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 
程序如下:
public class ThreadTest {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        new ThreadTest().init();
    }
    public void init() {
        final Business business = new Business();
        new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i < 50; i++) {
                    business.SubThread(i);
                }
            }
        }
        ).start();
        for (int i = 0; i < 50; i++) {
            business.MainThread(i);
        }
    }
    private class Business {
        boolean bShouldSub = true;// 这里相当于定义了控制该谁执行的一个信号灯
        public synchronized void MainThread(int i) {
            if (bShouldSub)
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            for (int j = 0; j < 5; j++) {
                System.out.println(Thread.currentThread().getName() + ":i=" + i
                        + ",j=" + j);
            }
            bShouldSub = true;
            this.notify();
        }
        public synchronized void SubThread(int i) {
            if (!bShouldSub)
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            for (int j = 0; j < 10; j++) {
                System.out.println(Thread.currentThread().getName() + ":i=" + i
                        + ",j=" + j);
            }
            bShouldSub = false;
            this.notify();
        }
    }
}问题1、进入 SubThread方法的this.notify不是说去唤醒一个等待的线程吗?这时不是还没有线程wait()了,为啥先唤醒而不是先wait呢?
问题2、SubThread的 if (!bShouldSub)这块什么时候进入,还有 MainThread方法的 if (bShouldSub)块什么时候进入初学 十分感谢各位!!多线程threadnotify

解决方案 »

  1.   

    首先要明白,主线程在init()中执行new Thread().start()这条语句只负责启动子线程。这条语句是瞬间执行完成的,不会阻塞主线程。
    子线程被start()语句“启动”后,并不是立刻得到CPU开始执行。“启动”仅仅代表一种“就绪”的状态,只是表明它已经可以执行了。但具体何时开始执行取决于Java虚拟机的调度。因此可能出现以下两种情况:情况一:子线程还未真正开始执行,主线程继续执行,到了business.MainThread(i);这句。由于bShouldSub的初始值为true,所以主线程执行到了this.wait(),阻塞在这里,等待子线程执行。由于!bShouldSub此时为false,所以子线程不会执行this.wait(),循环打印10句话后,用notify()将主线程唤醒。子线程下次进入SubThread()方法,由于!bShouldSub此时为true,所以子线程用wait()将自己阻塞起来,等待主线程唤醒它。情况二:在主线程执行到business.MainThread(i);之前,子线程已经开始执行了,!bShouldSub为false,因此子线程打印10句话后使用notify()来唤醒主线程。但此时主线程还没有被wait()阻塞,所以这句notify()并没有起什么作用。子线程下一次进入SubThread()方法时,由于bShouldSub已经改变,因此子线程阻塞,等待主线程执行到notify()时唤醒子线程。