Thread von außen stoppen

Tobsen1984

Grünschnabel
Hallo zusammen :)

Bin gerade an einer Thread Aufgabe dran und versteh nicht warum es in ner Endlos Schleife endet!?

Es gibt drei Klassen:
1. Hauptklasse
2. Mensakasse
3. Studenten

Es gibt 3 Kassen an denen sich 10 Studenten essen holen, bezahlen usw.
Mit dem Interrupted sollen die Threads geschlossen werden und alle gehen gesättigt nach hause...
leider fressen die bei mir ewig :(

Hoffe mir kann da jemand helfen****?


Die Studenten Klasse:
Java:
import java.util.List;
import java.util.Random;


public class Student extends Thread{
	private List<Mensakasse> aKassen;
	private int aId;
	
	public Student(List<Mensakasse> pKassen, int pId){
		this.aKassen = pKassen;
		this.aId = pId;
	}
	
	public int getID(){
		return this.aId;
	}
	
	public void run(){
		//int anzahl = 0;
		while(true){
			Mensakasse kasse = this.aKassen.get(0);
			Random r = new Random();
			int time;
			int i = 1;
			
			while(i < this.aKassen.size()){
				if(kasse.getSchlangenGroesse()> this.aKassen.get(i).getSchlangenGroesse()){
					kasse = this.aKassen.get(i);
				}
				i++;
			}
			
			System.out.println("Student Nr. '"+aId+"' stellt sich an Kasse Nr. '"+kasse.getID()+"' an.");
			kasse.studentHinzufuegen(this);
			time = r.nextInt(2500);
			try {
				this.sleep(time);
			} catch (InterruptedException e) {
				return;
			}
			finally{
				System.out.println("Student Nr. '"+aId+"' hat fertig gegessen und legt eine kleine Pause ein.");
			}
			
			time = r.nextInt(8000);
			
			try {
				this.sleep(time);
			} catch (InterruptedException e) {
				return;
			}
			finally{
				System.out.println("Student Nr. '"+aId+"' hat pausiert und holt sich Nachschlag.");
			}
			
		}
		//this.interrupt();
	}
}

Die Mensakasse Klasse:
Java:
import java.util.concurrent.Semaphore;


public class Mensakasse {
	private final int aId;
	private Semaphore aS = new Semaphore(1,true);
	private int aSchlangenGroesse = 0;
	
	public Mensakasse(int pId){
		this.aId = pId;
	}
	
	public int getID(){
		return this.aId;
	}
	
	public int getSchlangenGroesse(){
		return this.aSchlangenGroesse;
	}
	
	public void studentHinzufuegen(Student pStudent){
		int sId = pStudent.getID();
		try{
			this.aSchlangenGroesse++;
			this.aS.acquire();
			this.aSchlangenGroesse--;
			System.out.println("Student Nr. '"+sId+"' bezahlt an Kasse Nr. '"+aId+"'.");
			pStudent.sleep(5000);
		}catch(InterruptedException e){}
		finally{
			System.out.println("Student Nr. '"+sId+"' hat an Kasse Nr. '"+aId+"' bezahlt.");
			this.aS.release();
		}
	}
	
}

Die Hauptklasse


Java:
import java.util.ArrayList;
import java.util.List;


public class Hauptklasse {
	public static void main(String[] args){
		List<Mensakasse> aKassen = new ArrayList<Mensakasse>();
		List<Student> aStudenten = new ArrayList<Student>();
		int id;
		
		for(int i=0; i<3; i++){
			id= i+1;
			Mensakasse neu = new Mensakasse(id);
			aKassen.add(neu);
		}
		
		for(int i=0; i<10; i++){
			id= i+1;
			Student neu = new Student(aKassen, id);
			aStudenten.add(neu);
		}
		
		int x=0;
		while(x<aStudenten.size()){
			aStudenten.get(x).start();
			x++;
		}
		
		try {
			Thread.currentThread();
			Thread.sleep(1500);
		} catch (InterruptedException e) {
			System.out.println("InterruptedException bei sleep");
			return;
		}
		
		int y= 0;
		while(y<aStudenten.size()){
				aStudenten.get(y).interrupt();
				if(aStudenten.get(y).isInterrupted()){
					System.out.println("Student "+aStudenten.get(y).getID()+" hat genug gegessen und geht nach Hause");
					try {
						aStudenten.get(y).join();
					} catch (InterruptedException e){}
				}
				y++;
		}

		System.out.println("Alle Studenten haben genug gegessen und gehen heim.");
		return;
	}
}
 
Zuletzt bearbeitet von einem Moderator:
Zurück