Multithreading

Bastler7

Neues Mitglied
Hi,
ich habe ein Problem mit der Übergabe von Werten von einem Thread zum anderen.

Ich will in einem Thread einen Schalter auslesen und in einem anderen Thread eine Lampe blinken lassen.
Bisher mache ich beides in demselben Thread. Das ist aber nicht ideal, da Statusänderungen vom Schalter während der Laufzeit nicht berücksichtigt werden.

Wie muss ich das Programm ändern. Ich denke mal mit Get.Value...

Java:
import jcontrol.io.GPIO;
    class LegoThreadBlinker extends Thread{
        int gpioIn ;
        int gpioOut;
      public LegoThreadBlinker(int gpioIn, int gpioOut) {
        this.gpioIn  = gpioIn;
        this.gpioOut = gpioOut;  
        }
      public void run() {
        boolean stateSchalter;
        for (;;) {
          stateSchalter = GPIO.getState(gpioIn);
          if (stateSchalter == true){
            GPIO.setState(gpioOut, GPIO.HIGH);
            try { jcontrol.lang.ThreadExt.sleep(10000); } catch ( InterruptedException e ) {}                   
            GPIO.setState(gpioOut, GPIO.LOW);
            try { jcontrol.lang.ThreadExt.sleep(10000); } catch ( InterruptedException e ) {}
            }
          }
        }
      }
  public class LegoArmaturenbrettMultiThread2  {
     public static void main(String args[]) {
     int blinkerLinksIn   = 4;
     int blinkerLinksOut  = 8;
     GPIO.setMode(blinkerLinksIn,   GPIO.FLOATING); 
     GPIO.setMode(blinkerLinksOut,  GPIO.PUSHPULL); 
     LegoThreadBlinker blinkerLinks;
     blinkerLinks = new LegoThreadBlinker(blinkerLinksIn,blinkerLinksOut);
     blinkerLinks.start();
    }
  }
 

nrg

Top Contributor
ich bin jetzt noch nicht so "threadsicher" aber vllt könnte es mit einem PipedWriter/Reader klappen.

Java:
import java.io.*;
import jcontrol.io.GPIO;
    class LegoThreadBlinker extends Thread {
        int gpioIn ;
        int gpioOut;
        private PipedReader in;
        public LegoThreadBlinker(int gpioIn, int gpioOut, PipedWriter out) throws IOException {
        	this.gpioIn  = gpioIn;
        	this.gpioOut = gpioOut;  
        	in = new PipedReader (out);
        }
        public void run() {
        	BufferedReader br = new BufferedReader(in);
            while (true) {
              try {
				if (Boolean.parseBoolean(br.readLine()) == true){
					GPIO.setState(gpioOut, GPIO.HIGH);
				    try { jcontrol.lang.ThreadExt.sleep(10000); } catch ( InterruptedException e ) {}                   
				    GPIO.setState(gpioOut, GPIO.LOW);
				    try { jcontrol.lang.ThreadExt.sleep(10000); } catch ( InterruptedException e ) {}
				    }
			} catch (IOException e) {
				e.printStackTrace();
			}
              }
            }
        }
}
    class LegoThreadSchalter extends Thread {
    	private PipedWriter out;
    	public LegoThreadSchalter(){
    		out = new PipedWriter();
    	}
    	public PipedWriter getPipedWriter(){
    		return out;
    	}
    	public void run() {
    		boolean stateSchalter; 
    		PrintWriter pw = new PrintWriter (out);
    		while (true) {
    			stateSchalter = GPIO.getState(gpioIn);
    			if (stateSchalter) pw.println(stateSchalter);
    		}
    	}  	
    }
    public class Tester  {
    	public static void main(String args[]) throws IOException {
    		int blinkerLinksIn   = 4;
    		int blinkerLinksOut  = 8;

    		GPIO.setMode(blinkerLinksIn,   GPIO.FLOATING); 
    		GPIO.setMode(blinkerLinksOut,  GPIO.PUSHPULL); 

    		LegoThreadSchalter blinkerSchalter = new LegoThreadSchalter();
    		LegoThreadBlinker blinkerLinks = new LegoThreadBlinker(blinkerLinksIn,blinkerLinksOut,blinkerSchalter.getPipedWriter());
    		blinkerSchalter.start();
    		blinkerLinks.start();
    }
}

Ungetestet, weil mir jcontrol.io.GPIO nix sagt.

grüße
nrg

edit: in LegoThreadSchalter solltest halt noch einen Sleep in die Schleife einbauen. (ka welches Interval du willst)
 
Zuletzt bearbeitet:

Bastler7

Neues Mitglied
Hi nrg,
besten Dank. Ich habe aber einen Haufen Fehlermeldungen erhalten, die mir gar nichts sagen.

error.jpg
 

nrg

Top Contributor
ich kucks mir mal an :). glaub da ist eh irgendwas mit den klammern schief gelaufen. solltest die try bissle deutlicher klammern. Dann blickt man besser durch. Probiers mal so: (ist glaub eh die einfachere Lösung) leider auch ungetestet :(.

Java:
import jcontrol.io.GPIO;
    class LegoThreadBlinker extends Thread {
        int gpioIn ;
        int gpioOut;
        private LegoThreadSchalter schalter;
        public LegoThreadBlinker(int gpioIn, int gpioOut, LegoThreadSchalter schalter) {
        	this.gpioIn  = gpioIn;
        	this.gpioOut = gpioOut;  
        	this.schalter = schalter;
        }
        public void run() {
            while (true) {
				if (schalter.getStateSchalter() == true){
					GPIO.setState(gpioOut, GPIO.HIGH);
				    try { jcontrol.lang.ThreadExt.sleep(10000); } catch ( InterruptedException e ) {}                   
				    GPIO.setState(gpioOut, GPIO.LOW);
				    try { jcontrol.lang.ThreadExt.sleep(10000); } catch ( InterruptedException e ) {}*/
				}
            }
        }
}
    class LegoThreadSchalter extends Thread {
		boolean stateSchalter; 
		int i = 0;
    	public boolean getStateSchalter() {
    		return stateSchalter;
    	}
    	public void run() {
    		while (true) {
                stateSchalter = GPIO.getState(gpioIn);
			    try {
			    	Thread.sleep(1000); 
			    } catch ( InterruptedException e ) {
			    	e.printStackTrace();
			    }
    		}
    	}  	
    }
    public class Tester  {
    	public static void main(String args[]) {
    		int blinkerLinksIn   = 4;
    		int blinkerLinksOut  = 8;

    		GPIO.setMode(blinkerLinksIn,   GPIO.FLOATING); 
    		GPIO.setMode(blinkerLinksOut,  GPIO.PUSHPULL); 

    		LegoThreadSchalter blinkerSchalter = new LegoThreadSchalter();
    		LegoThreadBlinker blinkerLinks = new LegoThreadBlinker(blinkerLinksIn,blinkerLinksOut,blinkerSchalter);
    		blinkerSchalter.start();
    		blinkerLinks.start();
    	}
    }
 
Zuletzt bearbeitet:

nrg

Top Contributor
edit: war quatsch :).

bei beiden Lösungen fehlt einfach die Klammer am ende von der Class LegoThreadBlinker. Habe es in beiden Lösungen editiert.

grüße
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
buzzlightyeah multithreading Java Basics - Anfänger-Themen 4
sserio Frage zu Threading - Multithreading Java Basics - Anfänger-Themen 2
I Threads Multithreading, Producer/Consumer, notify() Java Basics - Anfänger-Themen 6
M Mehre Dateien parallel kopieren mit Multithreading Java Basics - Anfänger-Themen 8
kilopack15 Verzweiflung wegen Berechnung mit Multithreading Java Basics - Anfänger-Themen 1
P Multithreading in Java Java Basics - Anfänger-Themen 9
N Threads Read-Modify-Write Problem bei Multithreading (philosopher dining problem) Java Basics - Anfänger-Themen 5
R Threads Multithreading Java Basics - Anfänger-Themen 15
Z Verständnisfrage zum Multithreading Java Basics - Anfänger-Themen 3
T Threads MultiThreading NullPointerException Java Basics - Anfänger-Themen 7
K Frage bzgl. Multithreading Java Basics - Anfänger-Themen 5
B Multithreading und eigene Queue entwickeln Java Basics - Anfänger-Themen 3
C Multithreading, Methoden sichern Java Basics - Anfänger-Themen 5
P Hilfe bei MultiThreading; Einige Fragen. Java Basics - Anfänger-Themen 14
S OOP Multithreading Java Basics - Anfänger-Themen 5
0din Multithreading und stop Java Basics - Anfänger-Themen 5
P Singletons und Multithreading Java Basics - Anfänger-Themen 11
U Anfängerfrage - Multithreading Java Basics - Anfänger-Themen 8
H Multithreading Java Basics - Anfänger-Themen 7
M Multithreading Java Basics - Anfänger-Themen 18
I Multithreading (Prüfungsvorbereitung) Java Basics - Anfänger-Themen 6
G UI friert bei Multithreading ein Java Basics - Anfänger-Themen 3
J Multithreading mit einer TextArea Java Basics - Anfänger-Themen 29
JFeel-x Multithreading in awt Java Basics - Anfänger-Themen 2
L NullpointerException wegen wahrscheinlichem Multithreading Java Basics - Anfänger-Themen 4
Z Multithreading Java Basics - Anfänger-Themen 2
P Multithreading Java Basics - Anfänger-Themen 22

Ähnliche Java Themen

Neue Themen


Oben