Dateien hochladen nach „praktkum3“
This commit is contained in:
parent
2224dd944f
commit
83e38c9650
125
praktkum3/DiningPhilosophers.java
Normal file
125
praktkum3/DiningPhilosophers.java
Normal file
@ -0,0 +1,125 @@
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
public class DiningPhilosophers {
|
||||
|
||||
// Anzahl der Philosophen
|
||||
private static final int NUM_PHILOSOPHERS = 5;
|
||||
|
||||
public static void main(String[] args) {
|
||||
Philosopher[] philosophers = new Philosopher[NUM_PHILOSOPHERS];
|
||||
Fork[] forks = new Fork[NUM_PHILOSOPHERS];
|
||||
|
||||
// Initialisiere Gabeln
|
||||
for (int i = 0; i < NUM_PHILOSOPHERS; i++) {
|
||||
forks[i] = new Fork(i);
|
||||
}
|
||||
|
||||
// Initialisiere Philosophen
|
||||
for (int i = 0; i < NUM_PHILOSOPHERS; i++) {
|
||||
Fork leftFork = forks[i];
|
||||
Fork rightFork = forks[(i + 1) % NUM_PHILOSOPHERS];
|
||||
|
||||
// Um Deadlock zu vermeiden, greift der letzte Philosoph zuerst zur rechten Gabel.
|
||||
if (i == NUM_PHILOSOPHERS - 1) {
|
||||
philosophers[i] = new Philosopher(i, rightFork, leftFork);
|
||||
} else {
|
||||
philosophers[i] = new Philosopher(i, leftFork, rightFork);
|
||||
}
|
||||
|
||||
new Thread(philosophers[i], "Philosopher-" + i).start();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class Fork {
|
||||
|
||||
private final int id;
|
||||
private boolean inUse;
|
||||
|
||||
// Konstruktor
|
||||
public Fork(int id) {
|
||||
this.id = id;
|
||||
this.inUse = false;
|
||||
}
|
||||
|
||||
// Liefert die ID der Gabel zurück
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
// Gabel aufnehmen
|
||||
public synchronized boolean take() {
|
||||
if (!inUse) {
|
||||
inUse = true; // Gabel ist jetzt in Benutzung
|
||||
try {
|
||||
Thread.sleep(1000); // 1 Sekunde warten, um die Gabel aufzunehmen
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false; // Gabel ist bereits in Benutzung
|
||||
}
|
||||
|
||||
// Gabel freigeben
|
||||
public synchronized void put() {
|
||||
inUse = false; // Gabel freigeben
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Fork-" + id;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Philosopher implements Runnable {
|
||||
private final int id;
|
||||
private final Fork leftFork;
|
||||
private final Fork rightFork;
|
||||
|
||||
public Philosopher(int id, Fork leftFork, Fork rightFork) {
|
||||
this.id = id;
|
||||
this.leftFork = leftFork;
|
||||
this.rightFork = rightFork;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
|
||||
// Linke Gabel aufnehmen
|
||||
System.out.println("Philosopher-" + id + " is trying to get " + leftFork);
|
||||
while (!leftFork.take()) {
|
||||
Thread.yield(); // Busy waiting entschärfen
|
||||
}
|
||||
System.out.println("Philosopher-" + id + " got " + leftFork);
|
||||
|
||||
// Rechte Gabel aufnehmen
|
||||
System.out.println("Philosopher-" + id + " is trying to get " + rightFork);
|
||||
while (!rightFork.take()) {
|
||||
Thread.yield(); // Busy waiting entschärfen
|
||||
}
|
||||
System.out.println("Philosopher-" + id + " got " + rightFork);
|
||||
|
||||
// Philosoph isst
|
||||
System.out.println("Philosopher-" + id + " is eating.");
|
||||
Thread.sleep(2000); // 2 Sekunden essen
|
||||
|
||||
// Gabeln freigeben
|
||||
leftFork.put();
|
||||
System.out.println("Philosopher-" + id + " put down " + leftFork);
|
||||
rightFork.put();
|
||||
System.out.println("Philosopher-" + id + " put down " + rightFork);
|
||||
|
||||
// Philosoph beendet das Essen
|
||||
System.out.println("Philosopher-" + id + " finished eating.");
|
||||
} catch (InterruptedException e) {
|
||||
Thread.currentThread().interrupt();
|
||||
System.out.println("Philosopher-" + id + " was interrupted.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
48
praktkum3/DistributedSorterClient.java
Normal file
48
praktkum3/DistributedSorterClient.java
Normal file
@ -0,0 +1,48 @@
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.PrintWriter;
|
||||
import java.net.Socket;
|
||||
import java.util.Scanner;
|
||||
|
||||
public class DistributedSorterClient {
|
||||
public static void main(String[] args) {
|
||||
new DistributedSorterClient().run();
|
||||
}
|
||||
|
||||
private void run() {
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
while (true) {
|
||||
System.out.print("Enter a string to sort (or press Enter to quit): ");
|
||||
String line = scanner.nextLine();
|
||||
if (line.isEmpty()) break;
|
||||
|
||||
// Senden und Empfangen der sortierten Zeile
|
||||
String sortedLine = sort(line);
|
||||
if (sortedLine != null) {
|
||||
System.out.println("Sorted: " + sortedLine);
|
||||
} else {
|
||||
System.out.println("Error communicating with server.");
|
||||
}
|
||||
}
|
||||
scanner.close();
|
||||
}
|
||||
|
||||
private String sort(String line) {
|
||||
String response = "";
|
||||
try (Socket socket = new Socket("localhost", 12345);
|
||||
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
|
||||
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) {
|
||||
|
||||
// Sende die Eingabezeile an den Server
|
||||
out.println(line);
|
||||
|
||||
// Warte auf die Antwort des Servers
|
||||
response = in.readLine();
|
||||
|
||||
} catch (Exception e) {
|
||||
System.err.println("Error communicating with server: " + e.getMessage());
|
||||
return null;
|
||||
}
|
||||
return response;
|
||||
}
|
||||
}
|
73
praktkum3/DistributedSorterServer.java
Normal file
73
praktkum3/DistributedSorterServer.java
Normal file
@ -0,0 +1,73 @@
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.PrintWriter;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.util.Arrays;
|
||||
|
||||
public class DistributedSorterServer implements Runnable {
|
||||
private final Socket clientSocket;
|
||||
|
||||
// Konstruktor
|
||||
public DistributedSorterServer(Socket clientSocket) {
|
||||
this.clientSocket = clientSocket;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
final int port = 12345;
|
||||
|
||||
try (ServerSocket serverSocket = new ServerSocket(port)) {
|
||||
System.out.println("Distributed Sorter Server is running on port " + port);
|
||||
|
||||
while (true) {
|
||||
// Warten auf neue Verbindung
|
||||
Socket client = serverSocket.accept();
|
||||
System.out.println("New client connected: " + client.getInetAddress());
|
||||
|
||||
// Neuen Thread starten, um die Client-Anfrage zu bearbeiten
|
||||
Thread thread = new Thread(new DistributedSorterServer(client));
|
||||
thread.start();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.err.println("Error: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try (
|
||||
BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
|
||||
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)
|
||||
) {
|
||||
String inputLine;
|
||||
|
||||
// Verarbeite alle Nachrichten vom Client
|
||||
while ((inputLine = in.readLine()) != null) {
|
||||
System.out.println("Received: " + inputLine);
|
||||
|
||||
// Sortiere die Buchstaben im String
|
||||
String sortedLine = sortCharacters(inputLine);
|
||||
System.out.println(inputLine + " -> " + sortedLine);
|
||||
|
||||
// Antwort zurück an den Client senden
|
||||
out.println(sortedLine);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
System.err.println("Error handling client: " + e.getMessage());
|
||||
} finally {
|
||||
try {
|
||||
clientSocket.close();
|
||||
System.out.println("Client disconnected.");
|
||||
} catch (Exception e) {
|
||||
System.err.println("Error closing client socket: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Sortiermethode für die Zeichen im String
|
||||
private String sortCharacters(String input) {
|
||||
char[] chars = input.toCharArray();
|
||||
Arrays.sort(chars);
|
||||
return new String(chars);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user