Hi,
ich habe eine Server implementiert, der MATLAB ausführt und Anfragen von Clients über Java weiterleitet und zurückschickt.
Nun wollte ich, um die Effektivität zu erhöhen auf einen Rechner einen Master Server implementieren der die Anfragen an SlaveServer übergibt, die jewils auf verschiedenen Rechner mit ihrer MATLAB Umgebung laufen.
Ich habe konkret vier wichtige Klassen:
Meine konkrete Frage ist wie kann ich einen Thread aus einer Queue entnehmen und bei diesem bestimmten Thread eine boolean Flrag änder?
ich habe eine Server implementiert, der MATLAB ausführt und Anfragen von Clients über Java weiterleitet und zurückschickt.
Nun wollte ich, um die Effektivität zu erhöhen auf einen Rechner einen Master Server implementieren der die Anfragen an SlaveServer übergibt, die jewils auf verschiedenen Rechner mit ihrer MATLAB Umgebung laufen.
Ich habe konkret vier wichtige Klassen:
- Network: für die Verwaltung, Anfrage Threads werden in einer Queue gepackt
- NetworkRequestThread: für jede Anfrage wird ein Thread gestartet
- NetworkSlaveServerStatus: ein Thread der die Slave Server abhört
- NetworkWorkerThread: der Anfrage-Threads aus der Queue holt und aufruft
Meine konkrete Frage ist wie kann ich einen Thread aus einer Queue entnehmen und bei diesem bestimmten Thread eine boolean Flrag änder?
Code:
public class NetworkWorkerThread implements Runnable{ private Network net; public NetworkWorkerThread(Network net) { this.net = net; } public void run() { synchronized(this){ while(net.getSlave1Status()|net.getSlave2Status() == true){ net.queueNotifyNext(); net.queueRemoveNext(); //hier müßte der Status des Threads geändert werden, damit der Thread aus NetworkRequestThread arbeiten kann } } } }
Code:
public class Network { //... public static Queue q = new LinkedList(); private boolean threadStatus = true; public void listen() { try { serverSkt = new ServerSocket(port); alive=true; new NetworkSlaveServerStatus(this).startThread(); new NetworkWorkerThread(this).startThread(); while(alive){ Socket skt = serverSkt.accept(); NetworkRequestThread netThread = new NetworkRequestThread(skt,this); q.add(netThread); } } catch (IOException ex) { //... } } public void queueNotifyNext() { q.iterator().next().notify(); } public void queueRemoveNext() { q.remove(); } public boolean getStatus() { return threadStatus ; } public void pause() { threadStatus = true; } public void proceed() { threadStatus = false; notify(); } }
Code:
public class NetworkRequestThread implements Runnable{ //... public void run() { //... synchronized (this){ while(net.getStatus()) { try { wait(); } catch (InterruptedException ex) { Logger.getLogger(NetworkRequestThread.class.getName()).log(Level.SEVERE, null, ex); } } } } //... }
Comment