2013-01-31 35 views
2

我有一些代碼裏面給這裏如何將一個變量添加到一個ArrayList的ExecutorService的線程

public void doScan() { 
    Log.i(LOG_TAG, "Start scanning"); 

    ExecutorService executor = Executors.newFixedThreadPool(NB_THREADS); 
    for(int dest=0; dest<255; dest++) { 
     String host = "192.168.5." + dest; //add net address instead of hardcoding 
     executor.execute(pingRunnable(host)); 
    } 

    Log.i(LOG_TAG, "Waiting for executor to terminate..."); 
    executor.shutdown(); 
    try { executor.awaitTermination(10*1000, TimeUnit.MILLISECONDS); } catch (InterruptedException ignored) { } 
    Log.i(LOG_TAG, "Scan finished"); 
} 


private Runnable pingRunnable(final String host) { 
    return new Runnable() { 
     public void run() { 
      Log.v(LOG_TAG, "Pinging " + host + "..."); 
      try { 
       Socket s = null; 
       s = new Socket(InetAddress.getByName(host), ACES_PORT); 

       Log.v(LOG_TAG, "conn:"+s.toString()); 
       if(s.isConnected()){ 
        Log.v(LOG_TAG, "connected " + host); 
        foundDevicesArray.add(host); 
       } 


      } catch (UnknownHostException e) { 
       Log.e(LOG_TAG, "Not found", e); 
      } catch (IOException e) { 
       Log.e(LOG_TAG, "IO Error", e); 
      } 
     } 
    }; 
} 

我試圖挽救了主人的連接線程內。我有一個全局的(我是新來的android,所以我不知道是否它是所謂的)ArrayList線程內我做ArrayList.add(主機),它崩潰在我我不是確定如何從崩潰中獲取常見的錯誤信息。

+0

如何聲明和實例化foundDevicesArray? – assylias

+0

static ArrayList foundDevicesArray; –

+1

您需要初始化變量:'static List foundDevicesArray = new ArrayList ();'。但是,數組列表不是線程安全的,所以您應該使用CopyOnWriteArrayList(例如)來避免併發問題。您只需更改上面代碼的右側,而其餘代碼不需要修改。 – assylias

回答

2

您需要如下給它一個非空值初始化變量:

static List<String> foundDevicesArray = new ArrayList<String>(); 

然而要注意的ArrayList不是線程安全的,所以你應該使用一個線程安全的集合,而不是如CopyOnWriteArrayList爲例如,以避免併發問題。

因爲該集合也實現了List接口,只需更改聲明,你可以留下你的代碼的其餘部分,因爲它是:

static List<String> foundDevicesArray = new CopyOnWriteArrayList<String>(); 

最後的CopyOnWriteArrayList通過使副本實現了線程安全每次修改時都會在底層數組中進行修改。如果你的數組經常被修改但是沒有高度競爭(你沒有太多的線程試圖在同一時間訪問它),從內存使用的角度來看,synchronized list可能是一個更好的選擇 - 你應該嘗試兩者並且測量性能與內存使用情況作出明智的決定:

static List<String> foundDevicesArray = 
       Collections.synchronizedList(new ArrayList<String>()); 
相關問題