我有一個用java編寫的應用程序,需要找到網絡上所有可訪問的主機。一個有趣的事情發生...... ExecutorCompletionService
我使用InetAddress.isReachable()
來做到這一點,超時時間爲2000毫秒。
我查找當前本地計算機的IP地址,並基於此我試圖到達其他IP地址,結束1-255丟失了本地計算機的IP地址。
這一切工作正常單線程,只需要很長的時間,因爲大多數的IP地址不可訪問,因爲它們不存在,所以使用2秒超時。
爲了加快速度(和嘗試併發行動::作者Brian Goetz)我嘗試使用Future
和Callable
等
這一切都很好,以及。
但是我猜想使用ExecutorCompletionService
給我的用戶帶來更加敏感的應用,這樣他們就可以看到結果,因爲他們來了可以使用
Future<Reach> reachedFuture = completionService.take();
一個單處理器的機器具有以下配置上運行這個只有1導致被確定了四個可以訪問的主機:
private static final int poolSize = 10;
private static final int maxPoolSize = 10;
private static final long keepAliveTime = 120;
private static final LinkedBlockingQueue<Runnable> queue
= new LinkedBlockingQueue<Runnable>(20);
private static final ExecutorService executorService
= new ThreadPoolExecutor(poolSize, maxPoolSize, keepAliveTime, TimeUnit.SECONDS, queue);
private static final CompletionService<Reach> completionService
= new ExecutorCompletionService<Reach>(executorService);
它更改爲這是一個四核機器上也使得無法檢測所有連接的主機:
private static final int poolSize
= Math.max(2,Runtime.getRuntime().availableProcessors());
private static final int maxPoolSize
= Math.max(2,Runtime.getRuntime().availableProcessors());
通過將InetAddress.isReachable()
超時更改爲10秒,使最後一個配置正常工作。
而且通過改變配置如下的四核機器上也取得了用2秒的超時工作:
private static final int poolSize = 2;
private static final int maxPoolSize = 2;
我缺少的東西很明顯爲什麼出現這種情況?
阻止InetAddress.isReachable(2000)
檢測到我網絡上的所有可訪問主機?
爲什麼試圖運行多個InetAddress.isReachable()
調用失敗?
您是否嘗試過使用'Executors.newSingleThreadExecutor()'來查看它是否是導致該問題的線程代碼?這至少會引導我們走向正確的方向。 – 2011-04-29 13:09:40