Hejsa, skal bruge lidt hjælp til at finde en måde, så jeg kan holde mine "while(true)" loops tilbage når de ikke bruges.
Lige nu består mit program af en del tråde og while(true) loops, men mit program har efter hånden mistet en del performance, så der skal findes en løsning.
Til det har jeg kigget på wait(); og notify(); hvor jeg bruger synchronized. Her har jeg prøvet og lave en wait(); inden mit while loop går igang. Den stander fint nok, men kan så ikke få den startet igen.
Lidt kode af en klasse hvor jeg har prøvet at få det til og virke.- public class ReceivePowerData extends UnicastRemoteObject implements Runnable, RemoteI {
-
- private static final long serialVersionUID = 1L;
-
- protected BlockingQueue<Double> queue = null;
-
- private static double kWh;
-
- private Object lock = new Object();
-
-
- protected ReceivePowerData(BlockingQueue<Double> powerqueue) throws RemoteException {
- super();
- this.queue = powerqueue;
- }
-
- @Override
- public void run() {
-
- try {
- java.rmi.registry.LocateRegistry.createRegistry(1099); // Registers data RMI service
-
- RemoteI remote = new ReceivePowerData(queue);
- Naming.rebind("rmi://localhost/powerservice", remote);
- System.out.println("Power consumption service registered");
- System.out.println("Waiting for response from sensor");
- System.out.println("");
- }catch (Exception e) {
- System.out.println("RMI service could not be established");
- }
-
- synchronized (lock) {
- System.out.println("Wait for response from sensor");
- try {
- lock.wait();
- } catch (InterruptedException e1) {
- e1.printStackTrace();
- }
- System.out.println("Keep moving");
-
- while (kWh != 0) {
- System.out.println("inserting into queue");
- try {
- queue.put(kWh);
- } catch (InterruptedException e) {
- System.out.println("Could not put data into queue");
- }
- kWh = 0;
- }
-
- }
-
- }
-
-
-
- @Override
- public void SendTemperature(double data) throws RemoteException {
- // Nothing happens here
- }
-
- @Override
- public void SendPower(double power_data) throws RemoteException {
- ReceivePowerData.kWh = power_data;
-
- synchronized (lock) {
- lock.notify();
- }
- }
-
- @Override
- public void SendWater(double water_data) throws RemoteException {
- // Nothing happens here
- }
-
- }
Metoden SendPower bliver køres når den kaldes fra et andet program gennem et interface, og kWh får på den måde tildelt en værdi.
notify(); køres men den starter ikke den anden tråd igen, så while loopet går igang.. hvad har jeg gjort galt?
Indlæg senest redigeret d. 13.04.2015 19:34 af Bruger #21096