-1
輸入是整數列表。我想檢查我們是否可以派生出10個線程來查找整數的總和。我知道我們可以傳遞共享變量並進行同步,但有沒有辦法做到這一點,沒有同步塊來減少延遲? (可能沒有使用java.util.concurrent包類?)使用java中的線程列表中的數字總和
輸入是整數列表。我想檢查我們是否可以派生出10個線程來查找整數的總和。我知道我們可以傳遞共享變量並進行同步,但有沒有辦法做到這一點,沒有同步塊來減少延遲? (可能沒有使用java.util.concurrent包類?)使用java中的線程列表中的數字總和
如果你不修改你的列表,你可以組織你的線程,以便它們只讀取列表的一部分,並且由於它只是一個讀取,它應該不同步工作,下面應該工作(適應你的需要):
public class Test {
public static List<Integer> integers;
public static void main(String[] args) {
integers =new ArrayList<Integer>();
integers.add(1);
integers.add(3);
integers.add(2);
integers.add(6);
ExecutorService executor = Executors.newCachedThreadPool();
Test test = new Test();
Future<Integer> subRes1 = executor.submit(test.new ListTask(0, 1));
Future<Integer> subRes2 = executor.submit(test.new ListTask(2, 3));
int total;
try {
total = subRes1.get() + subRes2.get();
System.out.println(total);
} catch (InterruptedException | ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private class ListTask implements Callable<Integer>{
private int start;
private int end;
public ListTask(int start, int end){
this.start =start;
this.end = end;
}
@Override
public Integer call() throws Exception {
// TODO Auto-generated method stub
int subTotal = 0;
for (int i = start; i <= this.end; i++){
subTotal += integers.get(i);
}
return subTotal;
}
}
}
輸出:12
有你有試過什麼? – Sid
如果您的列表只包含正整數,並且值等於-1,則可以標記-1使用的編號... 另一種解決方案是用0標記它,因爲它不會影響結果 – 2017-03-04 17:06:16
是的,有很多方法來做到這一點。只需選擇一個,分享迄今已嘗試的代碼,然後我們就可以討論 –