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