diff options
Diffstat (limited to 'src/main/java/com/it_jaros/networkScanner/Scanner.java')
| -rw-r--r-- | src/main/java/com/it_jaros/networkScanner/Scanner.java | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/main/java/com/it_jaros/networkScanner/Scanner.java b/src/main/java/com/it_jaros/networkScanner/Scanner.java index 518372f..50c1139 100644 --- a/src/main/java/com/it_jaros/networkScanner/Scanner.java +++ b/src/main/java/com/it_jaros/networkScanner/Scanner.java @@ -22,6 +22,7 @@ public class Scanner { private final Counter counter = new Counter(); private final ProgressBar progressBar = new ProgressBar(); + private final Semaphore maxWorkers = new Semaphore(100000); private final Semaphore socketLimit; private final int timeoutInMillis; private final long delayInNanos; @@ -70,10 +71,20 @@ public class Scanner { try (ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();) { List<Future<Integer>> futures = new ArrayList<>(); while (portRange.hasNext()) { + maxWorkers.acquireUninterruptibly(); final int currentPort = portRange.next(); futures.add(executor.submit(() -> { - waitForSlot(portSlotFactory); - return scanPort(target, currentPort); + try { + waitForSlot(portSlotFactory); + int port = scanPort(target, currentPort); + if (port != -1) { + progress.open().incrementAndGet(); + } + return port; + } finally { + maxWorkers.release(); + progress.done().incrementAndGet(); + } })); } @@ -81,13 +92,11 @@ public class Scanner { try { int port = f.get(); if (port != -1) { + // openPorts is not threadsafe, so we do not update it outside the worker threads openPorts.set(port); - progress.open().incrementAndGet(); } } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); - } finally { - progress.done().incrementAndGet(); } }); } |
