2016-04-15 12 views
0

Ich habe eine for-Schleife als Teil einer aufrufbaren Klasse, die mehrmals parallel von einem threadpoolexecutor ausgeführt wird. Der Rest der aufrufbaren Klasse scheint angemessen zu funktionieren. Das ist wichtig, denke ich. Nur der Iterator verursacht ein Problem. Also hier ist die 411: Die Schleife läuft, sucht nach einem Alarm in einer Liste von Diskreten. Wenn es einen findet (was immer geschieht, wenn ich einen von ihnen stolpere), sollte es ein Alarmobjekt erstellen und ihm die ID seiner Position in der Liste geben. Dafür ist der Iterator zuständig.Problem mit Iterator-Wert in paralleler Aufgabe

Bis ich diese Aufgabe parallel ausführen ließ, gab der Iterator (int i) jedes Mal seine Position im Array zurück. Jetzt gibt es nur den Wert 0 zurück, obwohl das Array ordnungsgemäß durchlaufen wurde.

Hier ist der entsprechende Code der aufrufbar. Sind Iteratoren nicht Thread-sicher oder so? Ich bin verwirrt.

 //Create a list to store discretes 
     boolean[] boolist = new boolean[1024]; 
     //Read values from the site and assign them to the boolean array 
     mbc.readInputDiscretes(1, 0, boolist); 
     for (int i = 0; i < boolist.length; i++) { 
     //Checks to see if the alarm is alarmed. Do not be alarmed if the alarm is alarmed. 
      if(boolist[i]){ 
       //For each value of true we create a new alarm tag, set the alarm to active within the system, record its site ID and its Tag ID. 
       TagInfo alarmtag = new TagInfo(true, InfoBox.getSiteID(), i); 
       //THE ITERATOR ABOVE ONLY RETURNS 0, HOWEVER IT ITERATES THROUGH THE LIST PROPERLY. SO ALL TAGS ARE NOTICED BUT RETURN WITH AN ID OF 0. AHHHHHH. 
       //Add the tag to the list to return. 
       alarmtags.add(alarmtag); 
      } 
     } 

Edit:

Auf Wunsch ist hier die relevanten Teile der taginfo Klasse:

public class TagInfo { 
private int siteID;     //ID # of the site this tag belongs to 
private int tagID;     //ID # of the tag itself 
private int tagOffset;    //Integer 1-1024 related to the tags read position at its given site 
private int tagType;    //The type of tag (not yet implemented, just thought it would be useful eventually) 
private int tagEscDly;    //The amount of time to wait before we raise the priority level of an alarm referencing this specific tag 
private Timestamp lastPolled;  //The last time this site was checked 
private boolean alarmstatus;  //The alarm status of this specific tag, e.g. in alarm or not in alarm 

//Default empty constructor for TagInfo object 
public TagInfo(){} 

//Overloaded constructor for faster initialization of objects and fewer method calls 
public TagInfo(boolean alarmstatus, int siteID, int tagID){ 
    this.alarmstatus = alarmstatus; 
    this.siteID = siteID; 
    this.tagID = tagID; 
} 

der Code Hier ist das aufrufbare Aufruf:

 //Invoke run method on each site simultaneously, store results in a list 
     List<Future<List<TagInfo>>> futures=threadmaker.invokeAll(active_sites.stream().map(site -> new TAG_SCANNER(site, loggr)).collect(Collectors.toList())); 
+0

Veröffentlichen Sie die Erklärung von 'alerttag'. Auch ein [SSCCE] (http://sscce.org/) wäre nett. – m0skit0

+0

Ich dachte diese Zeile war die Erklärung? TagInfo Alarmtag = neue TagInfo (true, InfoBox.getSiteID(), i); – TheFunk

+1

Können Sie den Code von "TagInfo" (Konstruktor und Mitglieder Delaration mindestens) –

Antwort

0

Gelöst: Das Problem lag in der Verwendung einer falschen Variable.