大概你建議對數組進行分區,並且只允許一個線程訪問每個分區。這是一個沒有問題的合理方法。
事實上,fork/join框架可以做到這一點,並且可能適用於你試圖達到的目標。
例如查看java.util.concurrent.RecursiveAction的javadocs,其中顯示了對數組進行分區以對其進行分類的示例。簡而言之,該陣列被分區,直到分區大小低於閾值。然後每個後續分區再次分區(即遞歸)。
代碼如下所示:
class SortTask extends RecursiveAction {
final long[] array; final int lo; final int hi;
SortTask(long[] array, int lo, int hi) {
this.array = array; this.lo = lo; this.hi = hi;
}
protected void compute() {
if (hi - lo < THRESHOLD)
sequentiallySort(array, lo, hi);
else {
int mid = (lo + hi) >>> 1;
invokeAll(new SortTask(array, lo, mid),
new SortTask(array, mid, hi));
merge(array, lo, hi);
}
}
}
是用什麼辦法去上班?你說你想「放鬆」同步,但聽起來好像你會完全移除它。然後你會遇到所有已知的多線程代碼沒有同步的問題(線程覆蓋彼此的工作等) – Thomas 2012-03-12 03:49:02