Kommunikation zwischen nebenläufigen Threads

Hallo,
ich möchte ein Programm schreiben, in dem ein Thread hochzählt. Dieses Hochzählen soll aber zu jedem Zeitpunkt abgebrochen werden können.
Mein Ansatz ist bisher, dass ich einen Thread laufen lasse, der hochzählt, während ein zweiter Thread auf die Eingabe von "Abbruch" wartet. Wenn dann "Abbruch" eingegeben wird, soll ein boolean BlnAbbruch, der auch im Zählthread vorhanden ist, auf true gesetzt werden um das Hochzählen abzubrechen.

Falls das möglich ist, würde ich noch gerne im "ThreadAbbruch" einen zweiten boolean definieren, mit dem man das Hochzählen pausieren kann. Also dass es zwei Variablen gibt, die ich im einen Thread setzten und im anderen Thread verwenden kann.

Vielen Dank für eure Hilfe im Voraus.

Code:
public class ThreadAusgabe {
   
    public void start() {
       
        int i;
       
        for(i=0;BlnAbbruch = false;i++) {
           
            System.out.println(i);
           
            Thread.sleep(5000);
        }
    }
}

public class ThreadAbbruch implements Runnable{
   
    public void run() {
       
        boolean BlnAbbruch = false;
       
        while(BlnAbbruch == false) {
        Scanner ScnAbbruch = new Scanner(System.in);
       
        if(ScnAbbruch.equals("Abbruch")) {
           
            System.out.println("Das Programm wird abgebrochen.");
            BlnAbbruch = true;
       
        }else {
   
        System.out.println("Sie haben eine ungültige Eingabe gemacht. Bitte geben Sie \"Abbruch\"  ein.");
        }
    }
   
}
}
 
Klar ist das möglich. Deklariere einfach eine Klassenvariable/Feld so, dass beide Klassen darauf zugreifen können.
Aktuell kann ThreadAusgabe ja unmöglich die lokale Variable innerhalb der ThreadAbbruch.run() Methode sehen und damit auch nicht darauf zugreifen.
Desweiteren ändere:
Java:
for(i=0;BlnAbbruch = false;i++) {
in:
Java:
for(i=0;!BlnAbbruch;i++) {
(Hint: der '=' Operator ist eine Zuweisung und kein Vergleich!)
Du solltest außerdem dafür sorgen, dass Zugriffe auf die Variable synchronisiert sind, da sonst Änderungen vom einen Thread für den anderen Thread nicht sofort sichtbar sein könnten (lese hierzu JSR-133, Stichwort 'happens-before Beziehung'). Das kannst du am einfachsten realisieren, imden du die Klassenvariable als 'volatile' deklarierst.
 
Jetzt hab ich das Problem, dass so im main die Threads nicht deklariert werden können und die Meldung: "No enclosing instance of type Threads is accessible. Must qualify the allocation with an enclosing instance of type Threads (e.g. x.new A() where x is an instance of Threads)." rauskommt. Threads ist hierbei der Klassenname, wo die einzelnen Threads drin sind. Eine Lösung wäre es, die einzelnen Klassen als static zu definieren, aber dann klappt die Kommunikation ja nicht mehr.
 
Java:
import java.util.Scanner;

public class Zaehler implements Runnable {
    public static void main(String[] args) {
        Zaehler z = new Zaehler();
        z.start();

        // im main-Thread ausführen:
        Scanner input = new Scanner(System.in);
        String line;
        while (!(line = input.nextLine()).equals("Abbruch")) {
            System.out.println("Ungültige Eingabe");
        }

        System.out.println("Programm wird abgebrochen");
        z.stop();
    }

    private volatile boolean done;

    public void start() {
        done = false;
        Thread th = new Thread(this);
        th.setPriority(Thread.NORM_PRIORITY);
        th.start();
    }

    public void stop() {
        done = true;
    }

    @Override
    public void run() {
        try {
            for (int i = 0; !done; i++) {
                System.out.println(i);
                Thread.sleep(5000);
            }
        } catch (InterruptedException ex) {
            System.err.println("Interrupted");
        }
    }
}
 

Zurück
Oben