Migration Deep Dive für 16 · Concurrency öffnen →
⌂ ÜbersichtAlle Vergleiche
Modul 16 · 100 % Codeabdeckung

Concurrency

Vollständiger Legacy-Modern-Vergleich aller Java-Klassen, Tests, Maven-POMs und relevanten Ressourcen dieses Moduls. Jede Datei ist genau einmal einer fachlich passenden Vergleichsgruppe zugeordnet.

3Legacy-Dateien
3Modern-Dateien
70 → 69Codezeilen
7/7vollständig erfasst

Fachliche Einordnung

Legacy

Fester Thread Pool

Ein begrenzter Platform-Thread-Pool muss dimensioniert und beendet werden.

Modern

Virtual Threads

Pro Task wird ein leichtgewichtiger Virtual Thread verwendet.

Vergleichsfokus: Alle Dateien werden nach technischer Rolle und fachlicher Verantwortung gruppiert.
Wichtige Abgrenzung: One-to-many-Änderungen werden als Gruppe dargestellt; eine künstliche 1:1-Zuordnung wird vermieden.

Vollständige Abdeckungsmatrix

Die Ähnlichkeit ist eine technische Orientierung auf normalisiertem Quelltext. Sie ersetzt keine fachliche Bewertung.

VergleichsgruppeLegacy-DateienModern-DateienLegacy-ZeilenModern-ZeilenÄhnlichkeit
Build-Konfiguration113434100%
Task Runner und Test22363538%

Gemeinsame Modulstruktur

Das Pair-POM bindet die Legacy- und Modern-Submodule zusammen und gehört deshalb ebenfalls zur vollständigen Codeabdeckung.

Gemeinsam · 19 Zeilenpom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>at.aydin.academy</groupId>
        <artifactId>java-modernization-deep-dive</artifactId>
        <version>1.0.0</version>
        <relativePath>../../pom.xml</relativePath>
    </parent>
    <artifactId>16concurrency-pair</artifactId>
    <packaging>pom</packaging>
    <name>Concurrency: Legacy und Modern</name>
    <modules>
        <module>legacy</module>
        <module>modern</module>
    </modules>
</project>

Alle semantischen Codevergleiche

01Build-KonfigurationDirektvergleich · Legacy 34 / Modern 34 Zeilen · Ähnlichkeit 100%

Java-Version und Testkonfiguration wird verglichen.

Legacy-DateienModern-DateienEinordnung
pom.xmlpom.xmlDirektvergleich
Semantische Ähnlichkeit: 100%

Legacy

Legacy · 34 Zeilenlegacy/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <parent>
                <groupId>at.aydin.academy</groupId>
                <artifactId>16concurrency-pair</artifactId>
                <version>1.0.0</version>
                <relativePath>../pom.xml</relativePath>
            </parent>
            <artifactId>concurrency-legacy</artifactId>
            <packaging>jar</packaging>
            <name>Concurrency Legacy</name>

            <dependencies>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <scope>test</scope>
</dependency>

            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                    </plugin>

                </plugins>
            </build>
        </project>

Modern

Modern · 34 Zeilenmodern/pom.xml
<?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <parent>
                <groupId>at.aydin.academy</groupId>
                <artifactId>16concurrency-pair</artifactId>
                <version>1.0.0</version>
                <relativePath>../pom.xml</relativePath>
            </parent>
            <artifactId>concurrency-modern</artifactId>
            <packaging>jar</packaging>
            <name>Concurrency Modern</name>

            <dependencies>

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <scope>test</scope>
</dependency>

            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-compiler-plugin</artifactId>
                    </plugin>

                </plugins>
            </build>
        </project>
02Task Runner und TestDirektvergleich · Legacy 36 / Modern 35 Zeilen · Ähnlichkeit 38%

Platform-Thread-Pool wird mit Virtual Threads verglichen.

Legacy-DateienModern-DateienEinordnung
LegacyTaskRunner.java
LegacyTaskRunnerTest.java
VirtualThreadTaskRunner.java
VirtualThreadTaskRunnerTest.java
Direktvergleich
Semantische Ähnlichkeit: 38%

Legacy

package at.aydin.lab.concurrency.legacy;

import java.util.*;
import java.util.concurrent.*;

// Design Pattern: Task Executor
// Zweck: Begrenzter Plattform-Thread-Pool führt blockierende Aufgaben aus.
public final class LegacyTaskRunner {
    public List<String> run(List<Callable<String>> tasks) {
        ExecutorService pool = Executors.newFixedThreadPool(4);
        try {
            List<String> result = new ArrayList<>();
            for (Future<String> f : pool.invokeAll(tasks)) result.add(f.get());
            return result;
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
            throw new IllegalStateException(ex);
        } catch (ExecutionException ex) {
            throw new IllegalStateException(ex.getCause());
        } finally {
            pool.shutdown();
        }
    }
}
package at.aydin.lab.concurrency.legacy;

import org.junit.jupiter.api.Test;
import java.util.*;
import static org.junit.jupiter.api.Assertions.assertEquals;

class LegacyTaskRunnerTest {
    @Test
    void executesTasks() {
        assertEquals(List.of("A", "B"), new LegacyTaskRunner().run(List.of(() -> "A", () -> "B")));
    }
}

Modern

package at.aydin.lab.concurrency.modern;

import java.util.*;
import java.util.concurrent.*;

// Design Pattern: Task Executor
// Zweck: Ein Virtual Thread pro blockierender Aufgabe vereinfacht skalierbare Nebenläufigkeit.
public final class VirtualThreadTaskRunner {
    public List<String> run(List<Callable<String>> tasks) {
        try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor()) {
            List<Future<String>> futures = tasks.stream().map(executor::submit).toList();
            List<String> result = new ArrayList<>(futures.size());
            for (Future<String> future : futures) result.add(future.get());
            return List.copyOf(result);
        } catch (InterruptedException ex) {
            Thread.currentThread().interrupt();
            throw new IllegalStateException(ex);
        } catch (ExecutionException ex) {
            throw new IllegalStateException(ex.getCause());
        }
    }
}
package at.aydin.lab.concurrency.modern;

import org.junit.jupiter.api.Test;
import java.util.*;
import static org.junit.jupiter.api.Assertions.*;

class VirtualThreadTaskRunnerTest {
    @Test
    void usesVirtualThreads() {
        var runner = new VirtualThreadTaskRunner();
        assertEquals(List.of("A", "B"), runner.run(List.of(() -> Thread.currentThread().isVirtual() ? "A" : "X", () -> "B")));
    }
}
⌂ Cockpit