Java多线程实战篇:交叉打印

要求效果:先打印5次“printA…”,再打印5次“printB…”,每次打印间隔1秒,重复循环20次

方式一:使用wait()和notifyAll()方法

public class MyService {
	private volatile boolean flag = false;

	public synchronized void printA() {
		try {
			while (flag) {
				wait();
			}
			for (int i = 0; i < 5; i++) {
				System.out.println("printA...");
				TimeUnit.SECONDS.sleep(1);
			}
			flag = true;
			notifyAll();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	public synchronized void printB() {
		try {
			while (!flag) {
				wait();
			}
			for (int i = 0; i < 5; i++) {
				System.out.println("printB...");
				TimeUnit.SECONDS.sleep(1);
			}
			flag = false;
			notifyAll();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
public class BackupA implements Runnable {

	private MyService myService;

	public BackupA(MyService myService) {
		super();
		this.myService = myService;
	}

	@Override
	public void run() {
		myService.printA();
	}
}
public class BackupB implements Runnable {

	private MyService myService;

	public BackupB(MyService myService) {
		super();
		this.myService = myService;
	}

	@Override
	public void run() {
		myService.printB();
	}
}
public class Run {
	public static void main(String[] args) {
		MyService myService = new MyService();
		for (int i = 0; i < 20; i++) {
			new Thread(new BackupA(myService)).start();
			new Thread(new BackupB(myService)).start();
		}
	}
}

方式二:使用await()和signalAll()方法

public class MyService {
	private Lock lock = new ReentrantLock();
	private Condition condition = lock.newCondition();
	private boolean flag = false;

	public void printA() {
		try {
			lock.lock();
			while (flag) {
				condition.await();
			}
			for (int i = 0; i < 5; i++) {
				System.out.println("printA...");
				TimeUnit.SECONDS.sleep(1);
			}
			flag = true;
			condition.signalAll();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}

	public void printB() {
		try {
			lock.lock();
			while (!flag) {
				condition.await();
			}
			for (int i = 0; i < 5; i++) {
				System.out.println("printB...");
				TimeUnit.SECONDS.sleep(1);
			}
			flag = false;
			condition.signalAll();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
}
public class ThreadA implements Runnable {
	private MyService myService;

	public ThreadA(MyService myService) {
		super();
		this.myService = myService;
	}

	@Override
	public void run() {
		myService.printA();
	}
}
public class ThreadB implements Runnable {
	private MyService myService;

	public ThreadB(MyService myService) {
		super();
		this.myService = myService;
	}

	@Override
	public void run() {
		myService.printB();
	}
}
public class Run {
	public static void main(String[] args) {
		MyService myService = new MyService();
		for (int i = 0; i < 20; i++) {
			new Thread(new ThreadA(myService)).start();
			new Thread(new ThreadB(myService)).start();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_40378034/article/details/86766001
今日推荐