Java 想跑三步奇偶和和吗

Java 想跑三步奇偶和和吗,java,multithreading,concurrency,Java,Multithreading,Concurrency,我想运行三个线程奇数(打印奇数No)、偶数(打印偶数No)和求和(打印它们的和),代码工作正常,但程序没有终止。连线程都还在等待 包装viv.tyagi.EvenOddThrad.EvenOddAndSumCorrectVersion public class EvenOddAndSum { /** * @param args */ public static void main(String[] args) { // TODO Au

我想运行三个线程奇数(打印奇数No)、偶数(打印偶数No)和求和(打印它们的和),代码工作正常,但程序没有终止。连线程都还在等待

包装viv.tyagi.EvenOddThrad.EvenOddAndSumCorrectVersion

public class EvenOddAndSum
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        EvenOdd obj = new EvenOdd();

        Even e = new Even(obj);
        Odd o = new Odd(obj);
        Sum s = new Sum(obj);
        Thread oddThraed= new Thread(o,"Odd");
        Thread evenThraed= new Thread(e,"Even");
        Thread sumThraed= new Thread(s,"SUM");

        oddThraed.start();
        evenThraed.start();
        sumThraed.start();

    }



}



class EvenOdd 
{
     int seq;
     int evenNo;
     int oddNo=-1;
     int sum=0;  // 0 for odd , 1 for even , 2 for sum 

     public synchronized int getEvenNo()
     {
         System.out.println(Thread.currentThread().getName()+"Before seq"+seq);

        while (true)
        {
            System.out.println(Thread.currentThread().getName() + "waiting ...." + "seq is " + seq);
            if (seq == 1)
            {
                break;
            }
            else
            {

                try
                {
                    wait();
                }
                catch (Exception e)
                {
                    // TODO: handle exception
                }

            }
            System.out.println(Thread.currentThread().getName() + "released ...." + "seq is " + seq);
        }

         System.out.println(Thread.currentThread().getName()+"After seq"+seq);

         evenNo=evenNo+2;
         System.out.println(Thread.currentThread().getName()+" even---------------------------------------->"+evenNo);
         seq=2;
         notifyAll();

         return evenNo;
     }

     public synchronized int getOddNo()
     {
         System.out.println(Thread.currentThread().getName()+"Before seq"+seq);

         while (true)
            {
                System.out.println(Thread.currentThread().getName() + "waiting ...." + "seq is " + seq);
                if (seq == 0)
                {
                    break;
                }
                else
                {

                    try
                    {
                        wait();
                    }
                    catch (Exception e)
                    {
                        // TODO: handle exception
                    }

                }
                System.out.println(Thread.currentThread().getName() + "released ...." + "seq is " + seq);
            }

         System.out.println(Thread.currentThread().getName()+"After seq"+seq);
         oddNo=oddNo+2;
         System.out.println(Thread.currentThread().getName()+" odd---------------------------------------->"+oddNo);
         seq=1;
         notifyAll();

         return oddNo;
     }

     public synchronized int getSum()
     {
         System.out.println(Thread.currentThread().getName()+"Before seq"+seq);

         while (true)
            {
                System.out.println(Thread.currentThread().getName() + "waiting ...." + "seq is " + seq);
                if (seq == 2)
                {
                    break;
                }
                else
                {

                    try
                    {
                        wait();
                    }
                    catch (Exception e)
                    {
                        // TODO: handle exception
                    }

                }
                System.out.println(Thread.currentThread().getName() + "released ...." + "seq is " + seq);
            }

         System.out.println(Thread.currentThread().getName()+"After seq"+seq);
         sum=oddNo+evenNo;
         System.out.println(Thread.currentThread().getName()+" sum---------------------------------------->"+sum);
         seq=0;
         notifyAll();

         return sum;
     }

}



class Even implements Runnable
{
    EvenOdd obj;

    Even(EvenOdd obj)
    {
        this.obj=obj;
    }



    public void run()
    {


        for(int i=0;i<10;i++)
        {
        obj.getEvenNo();
            try{
        //  Thread.sleep(1000);
            }catch (Exception e) {
                // TODO: handle exception
            }
        }   
    }
}

class Odd implements Runnable
{
    EvenOdd obj;

    Odd(EvenOdd obj)
    {
        this.obj=obj;
    }

    public void run()
    {

        for(int j=1;j<10;j++)
        {
            obj.getOddNo();
        }   
    }
}

class Sum implements Runnable
{
    EvenOdd obj;

    Sum(EvenOdd obj)
    {
        this.obj=obj;
    }

    public void run()
    {

        for(int k=1;k<10;k++)
        {
            obj.getSum();
        }   
    }
}
公共类EvenOddAndSum
{
/**
*@param args
*/
公共静态void main(字符串[]args)
{
//TODO自动生成的方法存根
EvenOdd obj=新的EvenOdd();
偶数e=新偶数(obj);
奇数o=新的奇数(obj);
总和s=新总和(obj);
螺纹ODDTRAED=新螺纹(o,“奇数”);
线程evenThraed=新线程(e,“偶数”);
螺纹sumthread=新螺纹,“总和”);
oddsraed.start();
evenThraed.start();
sumThraed.start();
}
}
类偶数
{
内部顺序;
伊文诺;
int-oddNo=-1;
int sum=0;//0表示奇数,1表示偶数,2表示和
公共同步int getEvenNo()
{
System.out.println(seq“+seq”之前的Thread.currentThread().getName()+);
while(true)
{
System.out.println(Thread.currentThread().getName()+“waiting…”“+”seq是“+seq);
如果(seq==1)
{
打破
}
其他的
{
尝试
{
等待();
}
捕获(例外e)
{
//TODO:处理异常
}
}
System.out.println(Thread.currentThread().getName()+“released…”“+”seq是“+seq);
}
System.out.println(seq“+seq”后的Thread.currentThread().getName()+);
evenNo=evenNo+2;
System.out.println(Thread.currentThread().getName()+“偶数--------------------------------------------------------------------------------->”+evenNo);
seq=2;
notifyAll();
返回evenNo;
}
公共同步int getOddNo()
{
System.out.println(seq“+seq”之前的Thread.currentThread().getName()+);
while(true)
{
System.out.println(Thread.currentThread().getName()+“waiting…”“+”seq是“+seq);
如果(seq==0)
{
打破
}
其他的
{
尝试
{
等待();
}
捕获(例外e)
{
//TODO:处理异常
}
}
System.out.println(Thread.currentThread().getName()+“released…”“+”seq是“+seq);
}
System.out.println(seq“+seq”后的Thread.currentThread().getName()+);
oddNo=oddNo+2;
System.out.println(Thread.currentThread().getName()+“odd--------------------------------------------------------------------------------->”+oddNo);
seq=1;
notifyAll();
返回oddNo;
}
公共同步整数getSum()
{
System.out.println(seq“+seq”之前的Thread.currentThread().getName()+);
while(true)
{
System.out.println(Thread.currentThread().getName()+“waiting…”“+”seq是“+seq);
如果(seq==2)
{
打破
}
其他的
{
尝试
{
等待();
}
捕获(例外e)
{
//TODO:处理异常
}
}
System.out.println(Thread.currentThread().getName()+“released…”“+”seq是“+seq);
}
System.out.println(seq“+seq”后的Thread.currentThread().getName()+);
总和=奇数+偶数;
System.out.println(Thread.currentThread().getName()+“sum--------------------------------------------------------->“+sum);
seq=0;
notifyAll();
回报金额;
}
}
类甚至实现了可运行的
{
偶数obj;
偶数(偶数-奇数obj)
{
obj=obj;
}
公开募捐
{

对于(int i=0;i偶数
线程循环10次(i=0..9),而其他线程仅循环9次(j/k=1..9)。因此它(永远)等待其他线程告诉他轮到他了(通过设置
seq=1
notifyAll
)但是这种情况永远不会发生,因为其他线程已经终止。您需要修复循环限制。

谢谢,对我来说,这是一个线程通知问题,但这很简单