0

新しいスレッドを生成するServerClassがあります。

各スレッドには、処理用のデータのブロックが与えられます。各スレッドはデータの「x」チャンクを処理し、ServerClassに値を返します。ServerClassは収集された値を平均し、これをスレッドに渡します。そして、スレッドは平均値を使用して作業を再開します。データ全体がスレッドによって処理されるまで、同じプロセスが繰り返されます。

私はこれを書き、実行するたびに異なる出力を取得します。誰かが私が間違っていることを私に説明できますか?

ServerClass

public synchronized void put(double[] weight)
{

        //System.out.println(Counter);      

        weights.add(weight);

        if(Counter+1 == NoOfThreads)

        {           

            averageWeights();

            notifyAll();

            Counter =0;

        } else

            try {

                Counter++;

                wait();

            } catch (InterruptedException e) {

    e.printStackTrace();

        }

}

Threads Class

refer // ServerClass Reference

updatedweights // Averaged Value

int slots = data.size() / batchCount;

            for(int i=0; i<slots;i++)

            {

                double[] p = Algo(data,i*batchCount, (i+1)*batchCount, ServerClass.stepSize, labelIndex, refer.updatedweights);

                refer.put(p);

            }
4

1 に答える 1

0
public void put(double[] weight, Threads t)
{
     updatingWVector(weight);
        if(checkCondition())
        {            
            averageWeights();               
            Counter =0;
            synchronized(lock) {
                //System.out.println(t.getId());
                  lock.notifyAll();
            }
        } else
        {

                try {
                    updateCounter();
                    synchronized(lock) {
                        System.out.println(t.getId());
                        lock.wait();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
        }
}

コード内のすべてのメソッドはブロックlock内 にあります。private final Object lock = new Object();synchronized

于 2012-12-18T19:39:43.337 に答える