一个接一个地运行两个依赖线程

时间:2016-04-26 15:35:17

标签: java multithreading

我有两个线程--A和B.现在要求是在 Java 程序中实现以下内容:

功能

1)线程将在每一步加倍i时打印i = 1到50,

2)B线程在每一步中将j除以5将打印j = 200到0

手续/机制

1)A将执行一步并等待B,

2)B将执行一步并等待A

并且这一直持续到条件匹配。 这是我的代码。

代码:

public class JavaApplication6 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        A a = new A();
        B b = new B();
        a.setOtherThread(b);
        b.setOtherThread(a);
        a.start();
    }

}

class A extends Thread{
        Thread b;
        public void setOtherThread(Thread t){
            b = t;
        }

        public void run(){
            int i =1;
            synchronized(b){

                while(i<50){
                    try {
                        System.out.println("Request i = "+i);
                        i = i*2;
                        if(!b.isAlive()){
                            b.start();
                        }else{
                            notify();
                        }
                        b.wait();
                    } catch (InterruptedException ex) {
                        System.out.println("Error in Request Thread on wait");
                        Logger.getLogger(JavaApplication6.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                System.out.println("A Thread Will Close Now");
            }
        }
    }

class B extends Thread{
    Thread a;
    public void setOtherThread(Thread t){
        a = t;
    }

    public void run(){
        int j = 200;
        synchronized(a){

            while(j>5){
                try {
                    System.out.println("J in Response thread = "+j);
                    j = j/5;
                    notify();
                    a.wait();
                } catch (InterruptedException ex) {
                    Logger.getLogger(ReceiveResponse.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
            System.out.println("B Will Close Now");
        }
    }
}

现在它在A在其循环中运行第1步之后运行其循环的第2步后抛出异常。 输出如下:

输出:

Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
    at java.lang.Object.notify(Native Method)
    at javaapplication6.B.run
Exception in thread "Thread-0" java.lang.IllegalThreadStateException
    at java.lang.Thread.start
    at javaapplication6.A.run

我在线程方面非常弱。因此,如果能够详细了解我的错误以及正确实现我的要求的方法,那将会非常有用。

提前致谢。

0 个答案:

没有答案