如何停止线程互通?

时间:2015-12-19 16:43:00

标签: java multithreading thread-safety

JAVA线程初学者,我有两个线程都在从1到20计数,一个线程打印甚至没有。其他线程正在打印奇数。一个接一个地使用Thread Inter通信(在同一个实例上使用wait和notify方法)同时使用奇数-1偶数2奇数3偶数4 ...奇数17甚至-18奇数19。

这部分执行得很好。但在计数结束时,任何一个线程都处于等待状态,其他线程正在终止。

那么如何摆脱这个问题呢?我应该用什么方法来摆脱这个问题呢?

代码:

public class OddEvenNumbers {

    static A a= new A();
    public static void main(String[] args) {


        OddNumbers odd = new OddNumbers();
        EvenNumbers even = new EvenNumbers();

        Thread th1 = new Thread(odd);
        Thread th2 = new Thread(even);
        th1.start();

        try {
            Thread.sleep(1);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        th2.start();
    }
}

public class EvenNumbers implements Runnable {

    @Override
    public void run() {
        // TODO Auto-generated method stub

        for(int i=1;i<20;i++)
        {
            synchronized (OddEvenNumbers.a) {
                if(i%2==0)
                {
                    System.out.println("Even Numbers : "+i);

                }
                try {

                    OddEvenNumbers.a.notify();
                    OddEvenNumbers.a.wait();

                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


            }
        }
    }

}



public class OddNumbers implements Runnable {


    public void run() {

        System.out.println("In ODD run Method"); 


        for(int i=1;i<20;i++)
        {
            synchronized (OddEvenNumbers.a) {

                if(i%2!=0)
                {
                    System.out.println("ODD Number "+i);

                }
                try {

                    OddEvenNumbers.a.wait();
                    OddEvenNumbers.a.notify();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }
        }

    }

}

1 个答案:

答案 0 :(得分:1)

删除最后一次wait()调用(当计数器等于20时),这样最后一个打印线程就不会等到没有机会获得notify()。