From 7c7590b6f17854e6e3c8e4f0de28bff71cdb4f4b Mon Sep 17 00:00:00 2001 From: paul Date: Tue, 31 Mar 2020 23:35:48 +0200 Subject: [PATCH] small refinements, still flaky --- .../reactivestreams/DigitBlockChecker.java | 8 +++-- .../java/reactivestreams/SudokuVerifier.java | 36 ++++++++++++------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/main/java/reactivestreams/DigitBlockChecker.java b/src/main/java/reactivestreams/DigitBlockChecker.java index 3a151da..655304f 100644 --- a/src/main/java/reactivestreams/DigitBlockChecker.java +++ b/src/main/java/reactivestreams/DigitBlockChecker.java @@ -12,12 +12,14 @@ public abstract class DigitBlockChecker extends SubmissionPublisher imp int currentRow; int currentColumn; + Flow.Subscription subscription; Collection digitsProcessed; @Override public void onSubscribe(Flow.Subscription subscription) { currentRow = 1; currentColumn = 0; + this.subscription = subscription; digitsProcessed = new HashSet<>(); subscription.request(9*9); } @@ -32,12 +34,12 @@ public abstract class DigitBlockChecker extends SubmissionPublisher imp if (currentDigitApplies(currentRow, currentColumn)) { if (digitsProcessed.contains(digit)) { submit(false); - close(); + subscription.cancel(); } digitsProcessed.add(digit); if (digitsProcessed.size() == 9) { submit(true); - close(); + subscription.cancel(); } } } @@ -47,7 +49,7 @@ public abstract class DigitBlockChecker extends SubmissionPublisher imp @Override public void onError(Throwable throwable) { System.err.println(throwable.fillInStackTrace()); - close(); + closeExceptionally(throwable); } @Override diff --git a/src/main/java/reactivestreams/SudokuVerifier.java b/src/main/java/reactivestreams/SudokuVerifier.java index 3208e06..8f2354b 100644 --- a/src/main/java/reactivestreams/SudokuVerifier.java +++ b/src/main/java/reactivestreams/SudokuVerifier.java @@ -20,12 +20,12 @@ public class SudokuVerifier implements Flow.Subscriber { digitPublisher = new SubmissionPublisher<>(); // Setup row and column checking subscribers IntStream.rangeClosed(1, 9).boxed() - .forEach(i -> rowCheckerAndColumnChecker(digitPublisher, i)); + .forEach(i -> rowCheckerAndColumnChecker(i)); // Setup square checking subscribers IntStream.rangeClosed(1, 3).boxed() .forEach(squareRow -> { IntStream.rangeClosed(1, 3).boxed() - .forEach(squareColumn -> subscribeBlockChecker(digitPublisher, new SquareChecker(squareRow, squareColumn))); + .forEach(squareColumn -> squareChecker(squareRow, squareColumn)); }); } @@ -34,26 +34,36 @@ public class SudokuVerifier implements Flow.Subscriber { digitStream.forEach(digitPublisher::submit); digitPublisher.close(); // Wait for checking subscribers to finish - while (finished.get() < digitPublisher.getSubscribers().size() && solved.get()) { - try { - Thread.sleep(5); - } catch (InterruptedException ex) { - System.out.println(ex.fillInStackTrace()); - } + int subscriberCount = digitPublisher.getSubscribers().size(); + while (true) { + if (!(finished.get() < subscriberCount && solved.get())) break; + justAMoment(); } return solved.get(); } - private void rowCheckerAndColumnChecker(SubmissionPublisher digitPublisher, Integer i) { - subscribeBlockChecker(digitPublisher, new RowChecker(i)); - subscribeBlockChecker(digitPublisher, new ColumnChecker(i)); + void rowCheckerAndColumnChecker(Integer i) { + subscribeBlockChecker(new RowChecker(i)); + subscribeBlockChecker(new ColumnChecker(i)); } - private void subscribeBlockChecker(SubmissionPublisher digitPublisher, DigitBlockChecker blockChecker) { + void squareChecker(Integer squareRow, Integer squareColumn) { + subscribeBlockChecker(new SquareChecker(squareRow, squareColumn)); + } + + void subscribeBlockChecker(DigitBlockChecker blockChecker) { digitPublisher.subscribe(blockChecker); blockChecker.subscribe(this); } + void justAMoment() { + try { + Thread.sleep(5); + } catch (InterruptedException ex) { + System.out.println(ex.fillInStackTrace()); + } + } + @Override public void onSubscribe(Flow.Subscription subscription) { subscription.request(1); // 1 Boolean result from the block checker @@ -69,8 +79,8 @@ public class SudokuVerifier implements Flow.Subscriber { @Override public void onError(Throwable throwable) { System.err.println(throwable.fillInStackTrace()); - solved.compareAndSet(true, false); finished.incrementAndGet(); + System.exit(1); } @Override