sartin
BAN USERMain class App.java
public class App
{
public static void main( String[] args ) {
ConsoleManager consoleManager = new ConsoleManager();
NumberPrinter numberPrinter1 = new NumberPrinter(1, consoleManager);
NumberPrinter numberPrinter2 = new NumberPrinter(2, consoleManager);
NumberPrinter numberPrinter3 = new NumberPrinter(3, consoleManager);
ExecutorService executor3 = Executors.newSingleThreadExecutor();
ExecutorService executor1 = Executors.newSingleThreadExecutor();
ExecutorService executor2 = Executors.newSingleThreadExecutor();
executor1.execute(numberPrinter1);
executor2.execute(numberPrinter2);
executor3.execute(numberPrinter3);
}
}
NumberPrinter.java
public class NumberPrinter implements Runnable {
private ConsoleManager consoleManager;
private int x;
public NumberPrinter(int x, ConsoleManager consoleManager) {
this.x = x;
this.consoleManager = consoleManager;
}
@Override
public void run() {
while (true) {
consoleManager.print(x);
}
}
}
ConsoleManager.java
public class ConsoleManager {
private int previouslyPrintedNumber = 0;
private Lock lock = new ReentrantLock();
public void print(int x) {
lock.lock();
switch (x) {
case 1:
if (previouslyPrintedNumber == 0 || previouslyPrintedNumber == 3) {
previouslyPrintedNumber = x;
System.out.print(x + " ");
}
break;
case 2:
if (previouslyPrintedNumber == 1) {
previouslyPrintedNumber = x;
System.out.print(x + " ");
}
break;
case 3:
if (previouslyPrintedNumber == 2) {
previouslyPrintedNumber = x;
System.out.print(x + " ");
}
break;
default:
throw new RuntimeException("Unrecognized input " + x);
}
lock.unlock();
}
}
- sartin June 02, 2015
I like your solution. It provides for the Open Close OO design principle while the solution I proposed is not.
One thing that I noticed though when I tried to run your code on Oracle Java 7 JVM is
Error:(44, 32) java: local variable threadId is accessed from within inner class; needs to be declared final
So you need to change the method declaration to
- sartin June 02, 2015