2012-06-07 71 views
0

我們有一個對象CollectedInfo,它包含一個Hashtable。在我們的應用程序中,我們填充這個Hashtable,然後迭代它來執行插入操作。不同的線程同時使用來執行此操作。調用get方法時java.util.Hashtable的AbstractMethodError

Hashtable中檢索值時,我們看到AbstractMethodError例外,顯示來自get方法Hashtable的跟蹤。一旦這個異常來了Java應用程序崩潰。

我們無法重現該異常,但是我們可以在一段時間內非常一致地在應用程序中看到相同的行爲。

下面是跟蹤:

SYS_ERR: Exception running task: java.lang.AbstractMethodError 
SYS_ERR: java.lang.AbstractMethodError 
SYS_ERR:  at java.util.Hashtable.get(Unknown Source) 
SYS_ERR:  at poll.CollectedInfo.getValuesForColumn(CollectedInfo.java:1026) 
SYS_ERR:  at poll.YYYMgr.saveData(YYYMgr.java:5346) 
SYS_ERR:  at poll.YYYMgr.saveData(YYYMgr.java:2412) 
SYS_ERR:  at poll.YYYMgr.saveData(YYYMgr.java:2250) 
SYS_ERR:  at poll.CommonPollAPI.saveData(CommonPollAPI.java:579) 
SYS_ERR:  at poll.XXXXData.run(XXXXData.java:76) 
SYS_ERR:  at management.scheduler.WorkerThread.run(WorkerThread.java:70) 

我們使用的是JRE 1.6.0,並在這個問題重現OS是Linux的紅帽企業Linux服務器版本5.6 Beta版(Tikanga)。

+1

您需要顯示一些代碼 –

+0

在其他系統上運行時是否看到相同的問題?因爲http://docs.oracle.com/javase/1.4.2/docs/api/java/lang/AbstractMethodError.html是這個錯誤是由於調用抽象方法或'某些類的定義已經發生了不可比擬的變化當前正在執行的方法最後編譯' –

+0

@SeanPatrickFloyd將信息加載到CollectedInfo對象中的類是不同的,該類用於收集數據並將其添加到此Object中,然後最終將其傳遞給YYMgr.saveData方法。這裏迭代完成並且值保存在數據庫中。有多個由單個線程調用的CollectedInfo對象實例,這些實例收集數據然後將其保存到DB – Ayush

回答

1

取一個Iterator類對象,然後嘗試獲取散列值。

//聲明

Iterator itr = hashtable.keySet().iterator(); 

//處理

while(itr.hasNext()) 
{ 
    String key = (String)itr.next(); 
     String value = (String)hashtable.get(key); 

      // write your desired code 
} 
+0

競爭線程怎麼樣?這不防止併發更新 – Bohemian

+0

每個線程都有自己的對象來轉儲值。因此沒有機會進入另一條車道。現在我正在Windows平臺上測試它,以檢查是否有任何與本機lib有關的事情 – Ayush

2

首先,Hashtable基本上是一個HashMap,所以......

您有:

  • 一個使用
  • 多個線程同時

什麼需要是編碼併發訪問一個HashMap

幸運的是,已經存在一個:ConcurrentHashMap。您需要編碼的唯一更改是使用特殊的線程安全方法putIfAbsent(K, V)