Beispiel zum java.util.concurrent (Semaphor)

Thomas Darimont

Erfahrenes Mitglied
Hallo!

Hier mal ein Beispiel, wie man anhand der neuen Klasse Semaphor einen bestimmten Bereich nur für eine bestimmte Anzahl von Threads gleichzeitig zugänglich machen kann:

Code:
package de.tutorials;

import java.util.concurrent.Semaphore;

public class Test39 {

	public static void main(String[] args) {
		new Test39().doIt();
	}

	private void doIt() {
		Semaphore s = new Semaphore(2);
		
		T t1,t2,t3;
		
		t1 = new T(s);
		t2 = new T(s);
		t3 = new T(s);
		
		t1.start();
		t2.start();
		t3.start();

	}

	class T extends Thread {
		private Semaphore sem;

		public T(Semaphore s) {
			this.sem = s;
		}
		
		private void out(String s){
			System.out.println("["+System.currentTimeMillis() + "] " + getName() + ": " + s);
		}

		public void run() {
			out("try to acquire semaphore");

			try {
				sem.acquire();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}

			out("managed to acquire semaphore");
			out("sleeps now for 5s...");
			try {
				Thread.sleep(5000L);
			} catch (InterruptedException e1) {
				e1.printStackTrace();
			}
			out("woke up!");
			out("try to release semaphore");

			sem.release();

			out("semaphore released!");
			this.sem = null;
		}
	}
}

Ausgabe:
[1099409841173] Thread-0: try to acquired semaphore
[1099409841183] Thread-0: managed to acquired semaphore
[1099409841183] Thread-0: sleeps now for 5s...
[1099409841183] Thread-1: try to acquired semaphore
[1099409841183] Thread-1: managed to acquired semaphore
[1099409841183] Thread-1: sleeps now for 5s...
[1099409841183] Thread-2: try to acquired semaphore
[1099409846190] Thread-0: woke up!
[1099409846190] Thread-0: try to release semaphore
[1099409846190] Thread-0: semaphore released!
[1099409846190] Thread-1: woke up!
[1099409846190] Thread-1: try to release semaphore
[1099409846190] Thread-1: semaphore released!
[1099409846190] Thread-2: managed to acquired semaphore
[1099409846190] Thread-2: sleeps now for 5s...
[1099409851197] Thread-2: woke up!
[1099409851197] Thread-2: try to release semaphore
[1099409851197] Thread-2: semaphore released!

Wie ihr sehen könnt, erhalten in diesem Beispiel nur die beiden ersten Threads (die die zuerst acquire am Semaphor aufgerufen haben) zutritt zu dem Bereich. Der dritte muss solange warten bis einer der beiden anderen die release Methode des Semaphors aufruft.

Gruß Tom