Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多生产者/一消费者Java多线程_Java_Multithreading - Fatal编程技术网

多生产者/一消费者Java多线程

多生产者/一消费者Java多线程,java,multithreading,Java,Multithreading,我有一个产生新线程的ServerClass 每个线程都有一个用于处理的数据块。每个线程处理“x”数据块,并向ServerClass返回一些值。 ServerClass平均收集的值并将其传递给线程。线程使用平均值恢复工作。 重复相同的过程,直到线程处理完整个数据 我写了这篇文章,每次执行时都会得到不同的输出。 有人能解释一下我做错了什么吗 ServerClass public synchronized void put(double[] weight) { //System.o

我有一个产生新线程的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);

            }
ServerClass
公开同步作废认沽权(双倍[]重量)
{
//系统输出打印项次(计数器);
重量。添加(重量);
if(计数器+1==NoOfThreads)
{           
平均权重();
notifyAll();
计数器=0;
}否则
试一试{
计数器++;
等待();
}捕捉(中断异常e){
e、 printStackTrace();
}
}
线程类
请参阅//ServerClass参考
更新的权重//平均值
int slots=data.size()/batchCount;
对于(int i=0;i
其中
lock
private final Object lock=new Object();

其余代码中的所有方法都在
synchronized
块中。

那么您的代码面临什么问题?请解释一下,阅读循环障碍,它们在这里对您很有用。@Jayamohan:即使在传递相同的输入之后,我也会得到不同的
updatedweights
变量。我想问,我可以调用
wai吗t()
同步的
方法中?它是否会阻止其他线程执行该方法(在我的例子中是
put()
)。
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();
                }
        }
}