2015-03-31 18 views
1

我覺得真的愚蠢的甚至問這個問題,可能是愚蠢的問,因爲我認爲答案是「它永遠不應該那樣做」,但我非常卡在這目前的問題我在,所以我想問無論如何。有時陣列不是從多個線程添加項目

我有一個數組類,我創建...

public class Search_Results_Item { 
    private String SortSearchSite; 
    private String SortSearchLocation; 
    private String SortTitle; 
    private String SortLinkURL; 
    private String SortImageSRC; 
    private String SortPrice; 
    private String SortDescription; 
    private String SortLocation; 
    private String SortDateTime; 
    private String SortTrueDateTime; 
    private String SortOriginalURL; 


    public Search_Results_Item(String SortSearchSite, String SortSearchLocation, String SortTitle, String SortLinkURL, String SortImageSRC, 
      String SortPrice, String SortDescription, String SortLocation, String SortDateTime, String SortTrueDateTime, String SortOriginalURL) { 
     this.SortSearchSite = SortSearchSite; 
     this.SortSearchLocation = SortSearchLocation; 
     this.SortTitle = SortTitle; 
     this.SortLinkURL = SortLinkURL; 
     this.SortImageSRC = SortImageSRC; 
     this.SortPrice = SortPrice; 
     this.SortDescription = SortDescription; 
     this.SortLocation = SortLocation; 
     this.SortDateTime = SortDateTime; 
     this.SortTrueDateTime = SortTrueDateTime; 
     this.SortOriginalURL = SortOriginalURL; 

    } 

我把它做我的方法...

private ArrayList<Search_Results_Item> SearchResultsRow = new ArrayList<Search_Results_Item>(); 

我從2個不同的線程是項目添加到這個開始在同一時間使用..

SearchResultsRow.add(new Search_Results_Item(sSite, sLocation, SortTitle, SortLinkURL, SortImageSRC, SortPrice, SortDescription, SortLocation, 
          SortDateTime, EPOCHDATETIME, sBaseURL)); 

然後,我有一個runnable,不斷運行,它這樣做...

  getWriteDB(); 
      Sql_Database_Globals.SQL_DATABASE.beginTransaction(); 

      while (SearchResultsRow.size() > 0) { 
       int theMax = SearchResultsRow.size() - 1; 
       SQLCOUNT++; 
       Search_Results_Item ITEM = SearchResultsRow.get(theMax); 
       SearchResultsRow.remove(ITEM); 
       try { 
        if (ITEM != null) { 

         SQLiteStatement statement = Sql_Database_Globals.SQL_DATABASE 
           .compileStatement("INSERT INTO TEMPSORT (SortSearchSite, SortSearchLocation, SortTitle, SortLinkURL, SortImageSRC, SortPrice, SortDescription, SortLocation, SortDateTime, SortTrueDateTime, SortOriginalURL) VALUES (?,?,?,?,?,?,?,?,?,?,?)"); 
         statement.clearBindings(); 
         statement.bindString(1, ITEM.getSortSearchSite()); 
         statement.bindString(2, ITEM.getSortSearchLocation()); 
         statement.bindString(3, ITEM.getSortTitle()); 
         statement.bindString(4, ITEM.getSortLinkURL()); 
         statement.bindString(5, ITEM.getSortImageSRC()); 
         statement.bindString(6, ITEM.getSortPrice()); 
         statement.bindString(7, ITEM.getSortDescription()); 
         statement.bindString(8, ITEM.getSortLocation()); 
         statement.bindString(9, ITEM.getSortDateTime()); 
         statement.bindString(10, ITEM.getSortTrueDateTime()); 
         statement.bindString(11, ITEM.getSortOriginalURL()); 


         statement.executeInsert(); 
        } else { 
         Log.d("EXCEPTION", "----------->NULL"); 
        } 
       } catch(Exception e1){ 
        // catch all the exceptions 
        Log.d("SQLEXCEPTION", "SQL - > " + e1.getMessage()); 

       } 

      } 

      Sql_Database_Globals.SQL_DATABASE.setTransactionSuccessful(); 
      Sql_Database_Globals.SQL_DATABASE.endTransaction(); 
      SQLDB.close(); 

現在爲了一些奇怪的原因。有時會有一些項目被假設添加到SearchResults中(並且計數之前和之後確認它被添加)實際上不會被查看並試圖插入到SQLDatabase中(這正是SQLCOUNT ++的功能) 。有時候它只有1條記錄,有時候它會記錄所有記錄的時間的3.90%。

我不能爲了我的生活開始明白我失蹤了。

+1

嘗試將'SearchResultsRow'設置爲volatile。請你詳細說明一下 – 2015-03-31 04:03:45

+0

。 – eqiz 2015-03-31 04:04:55

+1

如果它是一個arraylist,那麼這樣做:'volatile ArrayList SearchResultsRow;' – 2015-03-31 04:06:30

回答

1

在你的情況下,volatilesynchronizedList()將不起作用,因爲大小檢查邏輯和刪除邏輯是分開的。如果您想了解更多關於volatile的信息,請參閱When exactly do you use the volatile keyword in Java?

爲了使您的邏輯正常工作,您需要使您的方法​​。如果你想檢查使用情況,請參考this