2017-08-18 35 views
0

我想結果是FutureTask()調用參照對象,導致錯誤

jsonObject={"key":[2,2,3]} 
jsonObject={"key":[2,4,3]} 
jsonObject={"key":[2,4,6]} 

,但結果是

{"key":[2,4,6]} 
{"key":[2,4,6]} 
{"key":[2,4,6]} 

我不知道什麼是錯的。 請幫忙。 謝謝!

如何更改代碼? 對象始終是最後一個號碼。

代碼:

public class TestFutureTask { 
    public static void main(String[] args) { 
     int[] list = {1,2,3}; 
     ExecutorService executor = Executors.newCachedThreadPool(); 
     List<FutureTask<String>> futureTasks = new ArrayList<>(); 

     for(int i=0;i<list.length;i++){ 
      int[] list1 = list; 
      list1[i] = list1[i]*2; 
      JSONObject jsonObject = new JSONObject(); 
      jsonObject.put("key", list1); 
      futureTasks.add(new FutureTask<String>(new QueryExecutor(jsonObject))); 
     } 

     for(int n=0;n<futureTasks.size();n++){ 
      executor.submit(futureTasks.get(n)); 
     } 

     for(int n=0;n<futureTasks.size();n++){ 
      try { 
       System.out.println(futureTasks.get(n).get()); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } catch (ExecutionException e) { 
       e.printStackTrace(); 
      } 
      finally { 
       executor.shutdown(); 
      } 
     } 
    } 
} 

class QueryExecutor implements Callable<String> { 
    private JSONObject jsonObject; 
    public QueryExecutor(JSONObject jsonObject){ 
     System.out.println("jsonObject="+jsonObject); 
     this.jsonObject = jsonObject; 
    } 
    @Override 
    public String call(){ 
     String result = jsonObject.toString(); 
     return result; 
    } 

} 

我想,也許異步和方法調用()是指對象的問題。

ExecutorService和FutureTask。

回答

0

提醒Java中的數組是對象。

你的問題是相同的對象引用看到的代碼的下方片斷

int[] list = {1,2,3}; 
int[] list1 = list; 
list1[i] = list1[i]*2; 

在更新列表1甚至列表中,因爲它們指向同一個對象的內部,因此這是陣列也被更新參考在所有的Furture引用中傳遞給調用方法最終都是一樣的。

嘗試從

int[] list1 = list; 

更改爲

int[] list1 = Arrays.copyOf(list,list.length); 

運行,看看是否符合您的期望

+0

謝謝,它解決了我的問題。 –

+0

您的歡迎。我也意識到上面的代碼會改變邏輯,因爲列表不再被修改所修改。如果你想得到與問題中提到的結果相同的結果,請嘗試更改'jsonObject.put(「key」,list1);'to'jsonObject.put(「key」,Arrays.toString(list1));'' – Nishant

0
ArrayList<Integer> list = new ArrayList<Integer>(){{add(1);add(2);add(3);}}; 

    for(int i=0;i<list.size();i++){ 
     ArrayList<Integer> list1 = list; 
     list1.set((i),list1.get(i) * 2); 
     JSONObject jsonObject = new JSONObject(); 
     jsonObject.put("key", list1.toString()); 
     System.out.println(list1.toString()); 
    } 

在下面的代碼替換上面代碼:

int[] list = {1,2,3}; 
for(int i=0;i<list.length;i++){ 
    int[] list1 = list; 
    list1[i] = list1[i]*2; 
    JSONObject jsonObject = new JSONObject(); 
    jsonObject.put("key", list1); 
} 

enter image description here

相關問題