我写的一个多线程的例子,但打印线程不能退出,各位达人帮我看看。
谁帮我看看,PrintOperation怎么结束呀? 或者是我的线程同步有问题?
public class Counter {private int value;private boolean isWritable = true;public void add(){value++;}public void print(){System.out.println(value);}public boolean isWritable() {return isWritable;}public void setWritable(boolean isWritable) {this.isWritable = isWritable;}}
public class AddOperation implements Runnable {private Counter counter;private final int size;public AddOperation(Counter counter, int size) {this.counter = counter;this.size = size;}@Overridepublic void run() {try {for (int i = 0; i < size; i++) {synchronized (counter) {if (!counter.isWritable()) {counter.wait();}counter.add();counter.setWritable(false);counter.notify();}}} catch (InterruptedException e) {e.printStackTrace();}}}
public class PrintOperation implements Runnable{private Counter counter;private boolean canRun = true;public PrintOperation(Counter counter) {this.counter = counter;}@Overridepublic void run() {while(canRun){synchronized(counter){if(counter.isWritable()){try {counter.wait();} catch (InterruptedException e) {e.printStackTrace();}}counter.print();counter.setWritable(true);counter.notify();}}}public void stopThread(){synchronized(counter){this.canRun = false;counter.notify();}}}
public class MultiThreadTest { public final static int SIZE = 5; public static void main(String[] args) {Counter counter = new Counter();AddOperation addOperation = new AddOperation(counter,SIZE);PrintOperation printOperation = new PrintOperation(counter);Thread addThread = new Thread(addOperation);Thread printThread = new Thread(printOperation);addThread.start();printThread.start();}}