Java-线程同步与等待机制练习

使用线程同步与等待机制打印如下:

 *Thread-0#Thread-1@Thread-2

 * Thread-0#Thread-1@Thread-2

 *Thread-0#Thread-1@Thread-2

 * Thread-0#Thread-1@Thread-2

 *Thread-0#Thread-1@Thread-2

 *Thread-0#Thread-1@Thread-2

代码如下:

class Flag{
	private boolean thread0;
	private boolean thread1;
	private boolean thread2;
	
	public Flag(boolean thread0, boolean thread1, boolean thread2) {
		super();
		this.thread0 = thread0;
		this.thread1 = thread1;
		this.thread2 = thread2;
	}
	
	public boolean isThread0() {
		return thread0;
	}
	public void setThread0(boolean thread0) {
		this.thread0 = thread0;
	}
	public boolean isThread1() {
		return thread1;
	}
	public void setThread1(boolean thread1) {
		this.thread1 = thread1;
	}
	public boolean isThread2() {
		return thread2;
	}
	public void setThread2(boolean thread2) {
		this.thread2 = thread2;
	
}
}

class MyThread implements Runnable {
	private Flag flag;

	public MyThread(Flag flag) {
		this.flag = flag;
	}
	@Override
	public void run() {
		synchronized (flag) {
		for (int i = 0; i < 1000; i++) {
				String threadName = Thread.currentThread().getName();
				if(flag.isThread0() && threadName.equals("thread0")) {
					System.out.println("&" + Thread.currentThread().getName());
					flag.setThread0(false);
					flag.setThread1(true);
					flag.setThread2(false);
					flag.notifyAll();
				} else if (flag.isThread1() && threadName.equals("thread1")) {
					System.out.println("*" + Thread.currentThread().getName());
					flag.setThread0(false);
					flag.setThread1(false);
					flag.setThread2(true);
					flag.notifyAll();
				} else if (flag.isThread2()  && threadName.equals("thread2")) {
					System.out.println("#" + Thread.currentThread().getName());
					flag.setThread0(true);
					flag.setThread1(false);
					flag.setThread2(false);
					flag.notifyAll();
				} else {
					try {
						flag.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				
		}
		}
	}

}


public class Test {
	public static void main(String[] args) {
		Flag flag = new Flag(true, false, false);
		Thread t0 = new Thread(new MyThread(flag));
		Thread t1 = new Thread(new MyThread(flag));
		Thread t2 = new Thread(new MyThread(flag));
		t0.setName("thread0");
		t1.setName("thread1");
		t2.setName("thread2");
		t2.start();
		t1.start();
		t0.start();
	}

运行结果如下:


总结:当对象未持有锁但是使用了wait或者notify会报错。





猜你喜欢

转载自blog.csdn.net/bugggget/article/details/80242086