【问题标题】:Multiple Producer / One Consumer Java Multithreading多生产者/一消费者 Java 多线程
【发布时间】:2012-12-19 03:39:43
【问题描述】:

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

            }

【问题讨论】:

  • 您的代码面临的问题是什么?解释一下
  • 阅读循环障碍,在这里它们对你很有用。
  • @Jayamohan :即使通过相同的输入,我也会得到不同的updatedweights 变量。我想问一下,我可以在synchronized 方法中调用wait() 吗?它会阻止其他线程执行该方法吗(在我的情况下为put())。

标签: java multithreading


【解决方案1】:
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块中。

【讨论】:

    猜你喜欢
    • 2014-10-13
    • 1970-01-01
    • 2017-02-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多