Thread abwechseln (Grundidee)

Status
Nicht offen für weitere Antworten.

MAIAarts.

Mitglied
Guten Abend,

ich möchte es in Java realsieren, dass sich zwei Threads abwechseln und unterbrechen. Nach der Unterbrechnung soll dann immer der andere Thread einen Teil seiner Arbeit tun, nur um wieder unterbrochen zu werden. Meine Idee füge ich unten ein.
Bei Fragen zum Code stehe ich natürlich bereit. Vielleicht hat jemand eine Idee, wie ich die Threads abwechseln kann.

Code:
public class Hauptt
{
	public static void main(String[] args) 
	{	
		//-- Thread beides in einer While-Schleife --
		ABCThread ABC1 = new ABCThread(true); 
		ABCThread ABC2 = new ABCThread(false); 
		new Thread(ABC1).start();
		new Thread(ABC2).start();
       }
}

Code:
public class ABCThread 
	implements Runnable
	
{
	private char kzeichen = 'a';
	private char gzeichen = 'A';



	
	public boolean grossklein;
	//Variable für Isinterrupted
	private static boolean isDran=false;

	public ABCThread(boolean grossklein)
	{
		this.grossklein=grossklein;
	}
	
	public void run()
	{

		if(grossklein)
		while (!Thread.currentThread().isInterrupted() )
		{
			for (int i= 0;i<26;i++)
			{
				try
				{
				
				System.out.print(gzeichen);
				
				gzeichen++;
				
				Thread.sleep(100);
				Thread.yield();
				Thread.currentThread().interrupt();
				
				}
				catch (InterruptedException o){}
			}
		}

		if(!grossklein)
		while (!Thread.currentThread().isInterrupted() )
		{
			for (int j= 0;j<26;j++)
			{
				try
				{
				
				System.out.print(kzeichen);
				kzeichen++;
				
				Thread.sleep(100);
				System.out.print(" ");
				Thread.yield();
				Thread.currentThread().interrupt();
				}
				catch (InterruptedException o){}
			}
		}
	}
}

Nicht erschrecken, falls es unüberischtlich aussehen sollte, es ist zweimal die gleiche Methode, Unterschied sind nur Groß- bzw. Kleinbuchstaben.

Leider klappt es nicht mehr, seitdem ich die Isinterrupted Methode benutze. Vorher wechseln sich die Threads ab, wie sie gerade Lust haben.


Bis Dann.


MAIAarts.
 

André Uhres

Top Contributor
Das geht mit Hilfe der Synchronisation. Siehe auch: Java und die Synchronisation
Code:
package demo; 
/* 
* Hauptt.java 
*/ 
public class Hauptt { 
    public Hauptt() { 
        ABCThread ABC1 = new ABCThread(true, this); 
        ABCThread ABC2 = new ABCThread(false, this); 
        new Thread(ABC1).start(); 
        new Thread(ABC2).start(); 
    } 
    public static void main(final String[] args) { 
        new Hauptt(); 
    } 
} 
class ABCThread implements Runnable { 
    private char kzeichen = 'a'; 
    private char gzeichen = 'A'; 
    private boolean gross; 
    private Hauptt abc; 
    public ABCThread(final boolean gross, final Hauptt abc) { 
        super(); 
        this.gross = gross; 
        this.abc = abc; 
    } 
    public void run() { 
        for (int i = 0; i < 26; i++) { 
            synchronized (abc) { 
                if (gross) { 
                    System.out.println(gzeichen); 
                    gzeichen++; 
                    delay(100); 
                } else { 
                    System.out.println(" " + kzeichen); 
                    kzeichen++; 
                    delay(50); 
                } 
                abc.notify();//Nachdem der andere Thread geweckt wurde,... 
                try { 
                    abc.wait();//entschläft der laufende Thread und wartet, um später geweckt zu werden. 
                } catch (InterruptedException e) { 
                } 
                //Die zwei Threads werden folglich abwechselnd durchgeführt. 
            } 
        } 
    } 
    private void delay(final long millis) { 
        try { 
            Thread.sleep(millis); 
        } catch (InterruptedException o) { 
        } 
    } 
}
 

tfa

Top Contributor
Hier noch eine Version mit Lock und Condition:
Code:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ABCThread implements Runnable {

	private static Lock lock = new ReentrantLock();
	private static Condition condition = lock.newCondition();

	private char kzeichen = 'a';
	private char gzeichen = 'A';

	public boolean grossklein;

	public ABCThread(boolean grossklein) {
		this.grossklein = grossklein;
	}

	public void run() {

		if (grossklein) {
			for (int i = 0; i < 26; i++) {

				try {
					lock.lock();
					condition.await();
					System.out.print(gzeichen);
					Thread.sleep(100);
					gzeichen++;
				} catch (InterruptedException o) {
				} finally {
					lock.unlock();
				}
			}
		}

		if (!grossklein)

			for (int j = 0; j < 26; j++) {
				try {
					lock.lock();
					condition.signal();
					System.out.print(kzeichen);
					kzeichen++;
				} finally {
					lock.unlock();
				}
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.print(" ");
			}

	}

	public static void main(String[] args) {
		//-- Thread beides in einer While-Schleife -- 
		ABCThread ABC1 = new ABCThread(true);
		ABCThread ABC2 = new ABCThread(false);
		new Thread(ABC1).start();
		new Thread(ABC2).start();
	}
}

So ist das allerdings noch ein wenig buggy, da die Threads manchmal aus dem Takt kommen können, d.h.
einer ist zweimal hintereinander dran. Eigentlich bräuchte man zwei Conditions um das zu verhindern.

Kann es eigentlich sein, dass sich Threading-Fragen in letzter Zeit häufen?
 
G

Guest

Gast
Ist stoff einer Vorlesung. Soweit ich das verstanden habe sollte man das synchronized in unserer Aufgabenstellung noch nicht nutzen, erst in der nächsten ist das gefordert.
Gibt es keine Möglichkeit es mit einer Boolean Variable und, der einfachen Frage ob der Thread unterbrochen ist, schaffen?

Mit dem Synchronized habe ich es schon versucht. Schaue mr die beiden Lösungen natürlich an.
 

tfa

Top Contributor
André Uhres hat gesagt.:
Für diese einfache Aufgabenstellung empfehle ich eher synchronized zu verwenden :wink:
Ich rate meistens von synchronized ab - komplett. Das ist mir einfach zu "low-level". Das Angebot von java.util.concurrent ist so groß, dass für jeden Anwendungsfall was dabei sein sollte. Und die Wahrscheinlichkeit, das es dann wirklich funktioniert, ist damit wesentlich größer, als wenn man alles von Hand synchronisieren muss (bei mir jedenfalls).
 

tfa

Top Contributor
Erwischt! :)
Aber ich hab ja schon gesagt, wie man es reparieren kann.

PS: Dein Programm terminiert übrigens nicht. :lol:
 
G

Guest

Gast
Es lief einmal durch, erst die großen Buchstaben dann die kleinen. Dann veruschte ich die Threads abzuwechseln, seitdem muss ich es von Hand stoppen. Ich Frage mich auch, wieso Fragezeichen ausgegeben werden, wo ist der Teil des Codes, welcher diesen Fehler erzeugt (Fehler ist vielleicht falsch gesagt, gemeint ist unerwünschten Effekt).
 

MAIAarts.

Mitglied
Es lief einmal durch, erst die großen Buchstaben dann die kleinen. Dann veruschte ich die Threads abzuwechseln, seitdem muss ich es von Hand stoppen. Ich Frage mich auch, wieso Fragezeichen ausgegeben werden, wo ist der Teil des Codes, welcher diesen Fehler erzeugt (Fehler ist vielleicht falsch gesagt, gemeint ist unerwünschten Effekt).

Gut, dass ich als Gast schreiben kann. Nervt mich gerade.
Ich kann mir einfach nicht vorstellen solch einen hohen Schwierigkeitsgrad mit dieser Aufgabe gewählt zu haben. Immerhin steht sie unter Übung 1.

So hier ist eine Variante nahezu ähnlich, gibt allerdings nur die ersten beiden Buchstaben aus: einmal das kleine "a" und einmal das große "A". Dies sollte aber bis zum Z durchgezogen werden, und am besten dann immer weiter.

Code:
public class ABCThread 
	implements Runnable
	
{
	private char kzeichen = 'a';
	private char gzeichen = 'A';



	
	public boolean grossklein;
	//Variable für Isinterrupted
	private static boolean istDran=false;

	public ABCThread(boolean grossklein)
	{
		this.grossklein=grossklein;
	}
	
	public void run()
	{

		if(grossklein)
			//if (istDran)
		for(int ei = 0;!Thread.currentThread().isInterrupted();ei++ )
		{
			for (int i= 0;i<26 && istDran == true;i++)
			{
				try
				{
				
				System.out.print(gzeichen);
				
				gzeichen++;
				
				Thread.sleep(100);
				Thread.yield();
				istDran= false;
				Thread.currentThread().interrupt();
				}
				catch (InterruptedException o){}
				
			}
			
		}

		if(!grossklein)
			//if (!istDran)
		for (int ej = 0;!Thread.currentThread().isInterrupted();ej++ )
		{
			for (int j= 0;j<26 && istDran==false;j++)
			{
				try
				{
				System.out.print(kzeichen);
				
				kzeichen++;
				
				Thread.sleep(100);
				System.out.print(" ");
				Thread.yield();
				istDran= true;
				Thread.currentThread().interrupt();
				}
				catch (InterruptedException o){}
				
			}
			
		}
	}
}

Vielleicht ist mein Problem, dass meine Threads weiter ruhen, nachdem sie einmal aufgerufen wurden.
 

tfa

Top Contributor
Okay, ich hab die Mittagspause vorgezogen.
Code:
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ABCThread implements Runnable {

	private static Lock lock = new ReentrantLock();
	private static Condition ping = lock.newCondition();
	private static Condition pong = lock.newCondition();

	private char kzeichen = 'a';
	private char gzeichen = 'A';

	public boolean grossklein;

	public ABCThread(boolean grossklein) {
		this.grossklein = grossklein;
	}

	public void run() {

		if (grossklein) {
			for (int i = 0; i < 26; i++) {

				try {
					lock.lock();
					ping.await();					
					System.out.print(gzeichen);					
					gzeichen++;
					pong.signal();
					Thread.sleep(10);
				} catch (InterruptedException o) {
				} finally {
					lock.unlock();
				}
			}
		}

		if (!grossklein)

			for (int j = 0; j < 26; j++) {
				try {
					Thread.sleep(10);
					lock.lock();					
					ping.signal();
					System.out.print(kzeichen);
					kzeichen++;	
					pong.await();					
				}
				catch(InterruptedException x){}
				finally {
					lock.unlock();
				}				
				System.out.print(" ");
			}
	}

	public static void main(String[] args) throws Exception {		
		for (int i=0; i<1000; i++){
			System.out.printf("%4d: ",i);
			ABCThread ABC1 = new ABCThread(true);
			ABCThread ABC2 = new ABCThread(false);
			Thread t1 = new Thread(ABC1);
			Thread t2 = new Thread(ABC2);
			t1.start();
			t2.start();
			t1.join();
			t2.join();
			System.out.println();
		}
	}
}
Und jetzt kommst du! :)
 
W

Wolfram

Gast
MAIAarts. hat gesagt.:
Ich kann mir einfach nicht vorstellen solch einen hohen Schwierigkeitsgrad mit dieser Aufgabe gewählt zu haben. Immerhin steht sie unter Übung 1.

Das liegt wahrscheinlich daran, dass etwas *SEHR* ähnliches bereits irgendwo auf den Folien steht, in denen Du nur ein paar Zeilen ändern musst. Die erwarten eigentlich nicht, dass Du das Rad neu erfindest - wohl aber, dass Du die Vorlesung nacharbeitest. Als ich das nach einiger Zeit begriffen hatte, gingen mir die Übungen damals unglaublich viel leichter von der Hand. :)

Wobei es natürlich viel lehrreicher ist, das Rad neu zu erfinden. ;)

Meine Lösung war zu ähnlich, aber wenn alle eine posten, mache ich mit :)

Andres Lösung braucht vermutlich noch ein notify() nach der for-Schleife, um zu terminieren. Das ist dann insgesamt ein notify() zu viel, genau wie zu Anfang eines verloren geht, weil der andere Thread noch nicht wartet, aber das macht ja nix.

Code:
package abwechseln;

class ABCThread extends Thread {
    
    final static Object lock=new Object(); // Klassenvariable, um alle threads drauf zu synchronisieren.
    
    char zeichen;  // Objektvariablen, pro Thread
    
    ABCThread(boolean gk) {
        this.zeichen= gk ? 'A' : 'a';
    }

    @Override
    public void run() {
        synchronized(lock) {
            
            for (int i=0; i<26; i++, zeichen++) {            
                lock.notify();
                try { lock.wait(); } catch (InterruptedException e) {}
                
                System.out.print(zeichen);
            }   
            lock.notify();
        }
    }
}

public class Main {
    public static void main(String[] args) {  
        ABCThread ABC1 = new ABCThread(true);
        ABCThread ABC2 = new ABCThread(false);
        ABC1.start();
        ABC2.start();
    }
}
 

MAIAarts.

Mitglied
So, werde es direkt testen, und durcharbeiten. Es gibt allerdings eine Unklarheit:

Code:
ABCThread(boolean gk) {
        this.zeichen= gk ? 'A' : 'a';
    }

Verstehe diese Zeile nicht die mit "this" beginnt.


So hat die Aufgabestellung ausgesehen:

Aufgabe 3 (Abwechseln erzwingen)
Wie können Sie erreichen, dass die Threads klein und groß abwechselnd an die Reihe kommen?
Anders ausgedrückt, erzwingen Sie, dass die Ausgabe der beiden Threads klein und groß so
aussieht:
entweder aAbBcCdDeEfF...wWxXyYzZ oder AaBbCcDdEeFf....WwXxYyZz.
Hinweis: Führen Sie eine Kontrollvariable istDran ein, die festhält ob der Thread klein oder
der Thread groß an der Reihe ist.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Vorschläge für Umstellung auf Thread-Nutzung erwünscht Java Basics - Anfänger-Themen 11
Z Sikuli Thread Fehler Java Basics - Anfänger-Themen 3
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Thread.sleep() Java Basics - Anfänger-Themen 5
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
C Thread in Methode + raus aus der Schleife Java Basics - Anfänger-Themen 10
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
B Thread Problem Java Basics - Anfänger-Themen 7
N KeyListener in Thread Java Basics - Anfänger-Themen 0
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
J BouncingBalls 1 Thread Java Basics - Anfänger-Themen 3
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
T Thread Pool mit Work Stealing Java Basics - Anfänger-Themen 1
R Java Thread Java Basics - Anfänger-Themen 10
J Welche Methoden laufen im neuen thread ?? Java Basics - Anfänger-Themen 9
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5
K Thread - Methoden in die run Methode Schreiben Java Basics - Anfänger-Themen 5
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
V Threads Exception in Thread behandeln Java Basics - Anfänger-Themen 3
S Methoden Multi-Thread und Methoden Objects. Java Basics - Anfänger-Themen 1
J Thread erstellen (BlueJ Projekt) Java Basics - Anfänger-Themen 3
P Exception in thread "main" java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 1
F Threads Variable aus einem Thread in main Methode? Java Basics - Anfänger-Themen 9
K Exception in thread "main" Java Basics - Anfänger-Themen 7
L Thread-Frage Java Basics - Anfänger-Themen 2
E Was ist ein idle-thread? Java Basics - Anfänger-Themen 1
D Exception in thread "AWT-EventQueue-0" Java Basics - Anfänger-Themen 8
J Threads Prozess in Thread auslagern Java Basics - Anfänger-Themen 2
G Thread mehrmals starten und schliessen Java Basics - Anfänger-Themen 6
F Thread Koordination (Vorteile/Nachteile) Java Basics - Anfänger-Themen 0
O Thread aus dem Thread stoppen Java Basics - Anfänger-Themen 6
O Swingworker/Thread Java Basics - Anfänger-Themen 3
R Focus auf JPanel im Thread Java Basics - Anfänger-Themen 9
S musik in eigenem thread Java Basics - Anfänger-Themen 2
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben