多線程從不同來源讀取。
一個單一的接入點到一個共享隊列(參見類RiderSynchronized嘗試寫)
每一行一個Reader讀取,它試圖插入到共享隊列通過方法RiderSynchronized提供。
當共享隊列已滿,我必須在一份聲明中插入到Oracle運行批處理。同時,所有對共享隊列的訪問都必須被拒絕。
代碼:
public class RiderSynchronized {
private ArrayDeque<JSONRecord> queue = new ArrayDeque<>();
private OracleDAO oracleDao;
private long capacity;
public RiderSynchronized(OracleDAO oracleDao, long capacity) {
this.oracleDao = oracleDao;
this.capacity = capacity;
}
public synchronized boolean addRecord(JSONRecord record) {
boolean success = false;
try {
while (queue.size() >= capacity) {
wait();
}
queue.add(record);
if (queue.size() < capacity) {
success = true;
notify(); //notify single Thread
} else {
JSONRecord currentRecord = null;
while ((currentRecord = queue.poll()) != null) {
oracleDao.insertRowParsedIntoBatch(currentRecord);
}
oracleDao.runBatch();
success = true;
notifyAll(); //it could be all Reading Threads are waiting. Notify all
}
} catch (Exception e) {
success = false;
}
return success;
}
}
我不得不承認我是有點擔心的事情。
1)閱讀器線程可以直接使用的addRecord含糊不清?他們會等待自己嗎?或者我必須執行一些其他的方法來檢查之前運行addRecord方法嗎?
2)當queue.size爲<時,我決定只通知一個線程,因爲恕我直言,此時沒有線程應該處於狀態等待狀態。我錯了嗎?我應該通知所有?
2b)「else」語句的確切問題。通知全部是否是一個好習慣?在這一點上,它可能是所有的等待?
3)最後。我有點擔心使用Lock e Condition Classes重寫所有內容。這是一個更好的決定嗎?或者可以,我如何運行這種情況?