2017-03-04 50 views
-1

輸入是整數列表。我想檢查我們是否可以派生出10個線程來查找整數的總和。我知道我們可以傳遞共享變量並進行同步,但有沒有辦法做到這一點,沒有同步塊來減少延遲? (可能沒有使用java.util.concurrent包類?)使用java中的線程列表中的數字總和

+1

有你有試過什麼? – Sid

+0

如果您的列表只包含正整數,並且值等於-1,則可以標記-1使用的編號... 另一種解決方案是用0標記它,因爲它不會影響結果 – 2017-03-04 17:06:16

+0

是的,有很多方法來做到這一點。只需選擇一個,分享迄今已嘗試的代碼,然後我們就可以討論 –

回答

0

如果你不修改你的列表,你可以組織你的線程,以便它們只讀取列表的一部分,並且由於它只是一個讀取,它應該不同步工作,下面應該工作(適應你的需要):

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