Java 未正确同步的线程
我试图创建一个类来计算5个不同形状的总面积和周长,但是给定形状的每个面积和周长都是由一个单独的线程计算的。到目前为止,我无法使线程正确同步,因此totalArea和TotalPermiture的计算是正确的。有什么让线程工作的建议吗?如果我不计算带有螺纹的每个形状,下面代码的totalArea和TotalPermission的面积应等于610.829,周长应等于187.115。如果我这样做,这些值就会变得完全随机Java 未正确同步的线程,java,multithreading,concurrency,synchronized,Java,Multithreading,Concurrency,Synchronized,我试图创建一个类来计算5个不同形状的总面积和周长,但是给定形状的每个面积和周长都是由一个单独的线程计算的。到目前为止,我无法使线程正确同步,因此totalArea和TotalPermiture的计算是正确的。有什么让线程工作的建议吗?如果我不计算带有螺纹的每个形状,下面代码的totalArea和TotalPermission的面积应等于610.829,周长应等于187.115。如果我这样做,这些值就会变得完全随机 package PartB; import PartA.Step2.*; im
package PartB;
import PartA.Step2.*;
import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
public class Picture implements Runnable{
public List<Shape> picture;
public Shape selectedShape;
public ListIterator<Shape> e;
double totalArea;
double totalPerimeter;
double a;
double b;
double c;
double length;
double width;
double height;
double radius;
public Picture(double a, double b, double c, double length, double width, double height, double radius){
this.a = a;
this.b = b;
this.c = c;
this.length = length;
this.width = width;
this.radius = radius;
this.height = height;
Shape[] shapes = {new Circle(radius), new Square(length),
new Rectangle(length, width), new Parallelogram(length, width, height),
new Triangle(a, b, c)};
picture = new CopyOnWriteArrayList<>(Arrays.asList(shapes));
}
public double getTotalArea(){return totalArea;}
public double getTotalPerimeter(){return totalPerimeter;}
@Override
public void run() {
synchronized (this) {
totalArea += selectedShape.getArea();
totalPerimeter += selectedShape.getPerimeter();
System.out.println(totalArea);
System.out.println(totalPerimeter);
}
}
public static void main(String[] args){
Picture pictures = new Picture(5, 6, 7, 8, 9, 10, 11);
for(pictures.e = pictures.picture.listIterator(); pictures.e.hasNext();){
pictures.selectedShape = pictures.e.next();
new Thread(pictures).start();
}
}
}
形状的子类之一:
package PartA.Step2;
public class Circle implements Shape, Cloneable {
double radius;
public Circle(double radius){
this.radius = radius;
}
@Override
public double getArea() {
CalculateShape calc = (radius)->Math.PI * Math.pow(radius[0], 2);
return calc.process(radius);
}
@Override
public double getPerimeter() {
CalculateShape calc = (radius)->2 * Math.PI * radius[0];
return calc.process(radius);
}
@Override
public String toString() {
return "Area: " + getArea() +
"\nPerimeter : " + getPerimeter();
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Circle){
if(((Circle) obj).radius == radius)
return true;
}
return false;
}
}
我忘了有一种方法可以让主线程等待线程不再活动。通过这样做,我能够让每条线计算出一个形状、面积和周长,而不受其他线的干扰。正如@cheiron所说,同步部分没有意义:
public static void main(String[] args){
Picture pictures = new Picture(5, 6, 7, 8, 9, 10, 11);
for(pictures.e = pictures.picture.listIterator(); pictures.e.hasNext();){
pictures.selectedShape = pictures.e.next();
Thread thread = new Thread(pictures);
thread.start();
while(thread.isAlive()){
try {
thread.join();
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
现在我得到了整个图片的正确总面积和总周长 你发布的代码中没有任何同步…我不太清楚你想要什么?这些线是做什么的?你为什么要同步?您希望以什么顺序运行它们?@Necreaux再次检查,因为您没有在同一对象上同步?@Cheiron我希望每个线程计算图片中形状的总面积和总周长。由于有5种不同的形状,因此制作了5条线程,每个线程计算给定形状的总面积和总周长,并将这些值添加到图片的总面积和周长中。
public static void main(String[] args){
Picture pictures = new Picture(5, 6, 7, 8, 9, 10, 11);
for(pictures.e = pictures.picture.listIterator(); pictures.e.hasNext();){
pictures.selectedShape = pictures.e.next();
Thread thread = new Thread(pictures);
thread.start();
while(thread.isAlive()){
try {
thread.join();
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}