我写的一个多线程的例子,但打印线程不能退出,各位达人帮我看看。

谁帮我看看,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;
	}

	@Override
	public 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;
	}
	
	@Override
	public 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();
		
	}
}


你可能感兴趣的:(java,thread,多线程)