Java 8 параллельный поток механики - PullRequest
0 голосов
/ 30 октября 2019

Есть ли способ обрабатывать каждый атрибут класса параллельно, используя лямбда-код java 8?

Например, для данного Car.java:

public class Car{
    private String color;
    private String model;
    private float value;
    private float tax;
    // and others attributes
    .
    .
    .
    // Getters and Setters
}

Я хотел бы сделать несколькопараллельный процесс над цветом, моделью, стоимостью, налогом и т. д. Таким образом, в основном желаемая логика будет выглядеть так:

parallel processing:
    - color
    - model
    - value
    - tax

then join and update Car.java object instance fields. 

Обратите внимание, что эта проблема не зависит от количества экземпляров автомобилей. Это может быть только один или много.

1 Ответ

1 голос
/ 30 октября 2019

Мне было любопытно, как это будет выглядеть. Предполагая, что имеет место ограничение, что обработка каждого из свойств не зависит друг от друга, это был бы один из способов использования parallelStream(). Но я очень сомневаюсь, что это окупается из-за накладных расходов параллельной машины. Можно сделать его еще более диковинным, используя реактивные потоки , например, RxJava.

public class Car{
    public String color;
    public String model;
    public float value;
    public float tax;

    public Car(String color, String model, float value, float tax) {
        this.color = color;
        this.model = model;
        this.value = value;
        this.tax = tax;
    }

    @Override
    public String toString() {
        return "Car{" +
                "color='" + color + '\'' +
                ", model='" + model + '\'' +
                ", value=" + value +
                ", tax=" + tax +
                '}';
    }
}

@Test
public void process() {
    List<Consumer<Car>> processors = Arrays.asList(
            c -> c.color = printThread(c.color.toLowerCase()),
            c -> c.model = printThread(c.model.toLowerCase()),
            c -> c.value = printThread(c.value * c.value),
            c -> c.tax = printThread(c.tax / c.tax));

    Arrays.asList(new Car("Red", "AlphaGorilla", 1f, 0.5f), new Car("Blue", "Bloated++", 10f, 0.2f))
            .parallelStream().forEach(c -> {
        System.out.println(c);
        processors.parallelStream().forEach(p -> {
            p.accept(c);
            fakeExpensiveComputation();
        });
        System.out.println(c);
    });
}

private <T> T printThread(T smthg) {
    System.out.println(String.format("Calculated value %s in thread %d", smthg.toString(), Thread.currentThread().getId()));
    return smthg;
}

private void fakeExpensiveComputation() {
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        throw new RuntimeException();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...