summaryrefslogtreecommitdiff
path: root/src/main/java/com/it_jaros/networkScanner/Scanner.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/it_jaros/networkScanner/Scanner.java')
-rw-r--r--src/main/java/com/it_jaros/networkScanner/Scanner.java19
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();
}
});
}