Java-Bibliotheken nutzen
Groovy greift direkt auf alle Java-Klassen zu:
import java.time.*
import java.util.concurrent.*
def datum = LocalDate.of(2024, 3, 15)
println datum.plusDays(20)
println datum.dayOfWeek
println Duration.ofMinutes(135).toHours()
def liste = new ArrayList<String>()
liste.add("b"); liste.add("a")
Collections.sort(liste)
println liste
println Math.floorMod(-7, 3)
println java.util.UUID.nameUUIDFromBytes("x".bytes).toString().size()
println new Random(42).nextInt(100) >= 0
println String.valueOf([1, 2, 3] as int[])
println System.getProperty("java.version") != null
println Runtime.runtime.availableProcessors() > 0
println 'abc'.bytes
println new String([72, 105] as byte[])2024-04-04 FRIDAY 2 [a, b] 2 36 true [I@7180e701 true true [97, 98, 99] Hi
Threads und ExecutorService
import java.util.concurrent.*
def pool = Executors.newFixedThreadPool(4)
def futures = (1..5).collect { n -> pool.submit({ n * n } as Callable<Integer>) }
println futures*.get()
pool.shutdown()
def ergebnisse = Collections.synchronizedList([])
def threads = (1..3).collect { id ->
Thread.start {
ergebnisse << id * 10
}
}
threads*.join()
println ergebnisse.sort()
def zaehler = new java.util.concurrent.atomic.AtomicInteger()
(1..4).collect { Thread.start { 1000.times { zaehler.incrementAndGet() } } }*.join()
println zaehler.get()
def latch = new CountDownLatch(2)
2.times { Thread.start { latch.countDown() } }
latch.await()
println "Latch frei"[1, 4, 9, 16, 25] [10, 20, 30] 4000 Latch frei
Prozesse und Shell
def p = "echo Hallo aus der Shell".execute()
println p.text.trim()
def r = ["sh", "-c", "echo eins; echo zwei >&2; exit 3"].execute()
def out = new StringBuffer(), err = new StringBuffer()
r.waitForProcessOutput(out, err)
println "out=${out.toString().trim()} err=${err.toString().trim()} exit=${r.exitValue()}"
println "ls /".execute().text.readLines().size() > 3
println System.getenv("PATH") != null
println args.size()Hallo aus der Shell out=eins err=zwei exit=3 true true 0
Grape: Bibliotheken per Annotation
Mit @Grab lädt Groovy Abhängigkeiten aus Maven Central direkt im Skript:
@Grab('org.apache.commons:commons-lang3:3.14.0')
import org.apache.commons.lang3.StringUtils
println StringUtils.capitalize("groovy")Weitere Wege zu Bibliotheken: build.gradle (Gradle), pom.xml (Maven) oder @GrabResolver für eigene Repositories.
Merke
- Alle Java-Klassen sind in Groovy direkt nutzbar (
java.time,java.util.concurrent, ...) - Threads:
Thread.start { },ExecutorService,AtomicInteger "befehl".execute()startet Prozesse;.textliefert die Ausgabe@Grablädt Bibliotheken ohne Build-Datei
Aufgabe
Berechne parallel die Quadratzahlen von 1 bis 20 mit einem Thread-Pool.