我很難讓我的程序正常工作。簡而言之,我的程序由幾個初始線程組成:Main,MessageReceiver,Scheduler(使用Quartz包)和Scheduler線程調度的兩種線程類型:TraceReader和ScheduledEvent。現在,當TraceReader被觸發時,它會讀取一個特殊的跟蹤文件,並使用開始時間,重複間隔(500ms到1秒)和結束時間安排事件。目前,可以安排約140個事件同時觸發,這會導致大量的ConcurrentModificationException錯誤。現在一些代碼:Java同步以避免ConcurrentModificationExceptions?
public class Client { //main class
public static volatile HashMap<Integer, Request> requests;
public static class Request{
String node;
int file_id;
long sbyte;
int length;
int pc_id;
public Request(){
}
}
public static synchronized void insertRequest(int req_nr, String node, int file_id, long sbyte, int length, int pc_id) {
Request tempr = new Request();
tempr.node = node;
tempr.file_id = file_id;
tempr.sbyte = sbyte;
tempr.length = length;
tempr.pc_id = pc_id;
requests.put(req_nr, tempr);
}
public static synchronized void doSynchronized(int req_nr, String node, int file_id, long sbyte, int length, int pc_id) {
reqnr++;
String r = "P" + reqnr + "," + file_id + "," + Long.toString(sbyte) + "," + length;
insertRequest(Client.reqnr, node, file_id, sbyte, length, pc_id);
}
public class ScheduledEvent implements Job {
public synchronized boolean isRequested(long sbyte, int length, int file_id, String node) {
Request req;
Iterator<Integer> it = Client.requests.keySet().iterator();
while (it.hasNext()) {
req = Client.requests.get(it.next());
if (req.node.equals(node) && req.file_id == file_id && hits(req.sbyte, req.length, sbyte, length)) {
return true;
}
}
return false;
}
}
所以我基本上得到了ScheduledEvent類的isRequested方法的錯誤。由於有超過100個併發線程,我認爲由於其他線程正在使用Client.doSynchronized()而其他線程嘗試在isRequested方法中迭代請求對象這一事實導致的錯誤。有沒有辦法讓線程訪問同步的對象,而不使用阻塞(Thread.join()等)?
一些風格要點:Request的成員應該是'private',並添加getter和setter。請求也應該是「私人」的。你爲什麼使用一堆'靜態'方法?他們不會幫你建立一些漂亮和可擴展的東西.. – pjp 2009-09-29 16:15:57
感謝您的意見。我在Java編程方面並不擅長,並且不太瞭解這些關鍵字的作用。我大部分方法是靜態的原因是我以前得到了「靜態訪問非靜態方法」的錯誤。 – Azimuth 2009-09-29 16:20:38
如果我將聲明Requests private,我將無法從另一個類訪問它(例如ScheduledEvent)是不是? – Azimuth 2009-09-29 16:21:32