Grüßt euch.
Ich habe folgendes Problem:
Ich möchte 5 Threads (a1, a2, a3, a4, a5) in Java erstellen, die in einer bestimmten Reihenfolge ablaufen sollen:
1 2 3 4 5 6 | -----> a2------ | | a1 ---------> a3 ----------> a5 | | -----> a4 ----- |
Dies wird meines wissens nach durch Semaphoren definiert. Leider hört da mein Wissen bereits auf, da ich selbst mich kaum mit Java befasse. Gibts da irgendeinen einfachen Trick, wie die Threads a2, a3 und a4 zuerst anfangen, sobald a1 fertig ist und ebenso a5 erst anfängt, wenn a2, a3 und a4 fertig sind?
Hier der bisherige Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | package mthreadsem; import java.util.concurrent.Semaphore; public class SemTest { public static void main(String[] args) { new SemTest().taskExec(); } private void taskExec() { int perm = 3; Semaphore s = new Semaphore(perm); Tasks a1,a2,a3,a4,a5; a1 = new Tasks(s); a2 = new Tasks(s); a3 = new Tasks(s); a4 = new Tasks(s); a5 = new Tasks(s); a1.start(); a2.start(); a3.start(); a4.start(); a5.start(); } class Tasks extends Thread { private Semaphore s3m4ph0r3; public Tasks(Semaphore s) { this.s3m4ph0r3 = s; } private void out(String s){ System.out.println("["+System.currentTimeMillis() + "] " + getName() + ": " + s); } @Override public void run() { out("trying to acquire semaphore..."); try { s3m4ph0r3.acquire(); } catch (InterruptedException e) { } out("semaphore acquired successfully."); out("sleeping for 5s..."); try { Thread.sleep(5000L); } catch (InterruptedException e1) { } out("woke up!"); out("trying to release semaphore..."); s3m4ph0r3.release(); out("semaphore released successfully!"); this.s3m4ph0r3 = null; } } } |
Vielen Dank für die Hilfe!
Grüße