gpt4 book ai didi

java - 如何将变量添加到 ExecutorService 线程内的 ArrayList

转载 作者:行者123 更新时间:2023-11-30 09:27:18 24 4
gpt4 key购买 nike

我这里有一些代码

 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(host) 并且它崩溃了我不确定如何从崩溃中获取常见的错误消息。

最佳答案

您需要按如下方式初始化变量以赋予其非空值:

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

但是请注意,arraylists 不是线程安全的,因此您应该使用线程安全的集合,例如 CopyOnWriteArrayList例如,为了避免并发问题。

因为该集合还实现了 List 接口(interface),您只需更改声明即可,其余代码保持原样:

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

最后,CopyOnWriteArrayList 通过在每次修改时复制底层数组来实现线程安全。如果您的数组经常被修改但竞争不激烈(您没有很多线程试图同时访问它),一个 synchronized list从内存使用的角度来看可能是更好的选择 - 您应该同时尝试并衡量性能与内存使用情况以做出明智的决定:

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

关于java - 如何将变量添加到 ExecutorService 线程内的 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14637255/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com