2017-08-18 36 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

相关问题