首页  

两个线程,一个输出字母,一个输出数字,交替输出1A2B3C4D5E6F     所属分类 java 浏览量 1272
线程之间的交互协作 使用 通知等待机制

ReentrantLock 
Condition
await
signal

或者使用  Object  wait notify  notifyAll


public class NumAndAlphaPrint2 {

	private static final ReentrantLock lock = new ReentrantLock();
	private static final Condition numPrint = lock.newCondition();
	private static final Condition alphaPrint = lock.newCondition();
	
	private static final long SLEEP_TIME = 500;

	public static void main(String[] args) throws Exception {
		Thread numPrintThread = new NumPrintThread();
		Thread alphaPrintThread = new AlphaPrintThread();
		
        // 字母打印线程先启动
		alphaPrintThread.start();
		
		// 启动数字打印线程
	    numPrintThread.start();
		
		
	}
	
	
	private static void doSleep(long time){
		if(time<=0){
			return;
		}
		try{
			Thread.sleep(time);
		}catch(Throwable e){
			//
		}
	}

	static class NumPrintThread extends Thread {
		public void run() {
			String str = "123456";
			int len = str.length();
			for (int i = 0; i < len; i++) {
				
				System.out.print(str.charAt(i));
				doSleep(SLEEP_TIME);
				
				// 通知 字母打印线程
				lock.lock();
				try {	
					alphaPrint.signal();
	            } catch (Throwable e) {
					System.out.println("alphaPrint.signal error," + e);
				} finally {
					lock.unlock();
				}
				
				lock.lock();
				try {
					numPrint.await();
				} catch (Throwable e) {
					System.out.println("numPrint.await() error," + e);
				} finally {
					lock.unlock();
				}
				
			}
		}
	}

	static class AlphaPrintThread extends Thread {
		public void run() {
			String str = "ABCDEF";
			int len = str.length();
			for (int i = 0; i < len; i++) {
				// 先 await ,等待 通知 
				lock.lock();
				try {
					alphaPrint.await();
				} catch (Throwable e) {
					System.out.println("alphaPrint.await() error," + e);
				} finally {
					lock.unlock();
				}
				System.out.print(str.charAt(i));
				doSleep(SLEEP_TIME);
				
				// 通知 数字打印线程
				lock.lock();
				try {	
					numPrint.signal();
	            } catch (Throwable e) {
					System.out.println("numPrint.signal() error," + e);
				} finally {
					lock.unlock();
				}
				
			}

		}
	}

}


	
完整代码

Condition await signal 版本
https://gitee.com/dyyx/hellocode/blob/master/src/action/NumAndAlphaPrint2.java

Object  wait notify  版本 
https://gitee.com/dyyx/hellocode/blob/master/src/action/NumAndAlphaPrint3.java

上一篇     下一篇
devops简介及工具链

jenkins简介

java8 ConcurrentHashMap 锁机制

java面试题合集

单例模式几种实现方式

Mybatis工作原理简介