传统线程同步通讯技术

      子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次,请写出程序。java

1、代码实现

public class TraditionalThreadCommunication {
	public static void main(String[] args) {
		final Business business = new Business();
		
		new Thread(new Runnable() {
			public void run() {
				for(int i = 1; i <= 50; i++){
					try {
						business.sub(i);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}).start();
		
		for(int i = 1; i <= 50; i++){
			try {
				business.main(i);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

//将具备相似功能的业务代码抽象到同一个类中
//下面两个方法(sub/main)是互斥的,均是独立的一个同步模块,处于同一个互斥组(经过synchronized代表均属于同一个类,同一时刻只能有一个线程持有该锁)
class Business{
	//主线程和子线程切换执行的一个标识
	boolean flag = true;
	
	synchronized void sub(int i) throws InterruptedException{
//		if(!flag){
		//循环和if功能相仿,但更加完备
		while(!flag){
			//使当前线程等待...
			this.wait();
		}
		
		for(int j = 1; j <= 10; j++){
			System.out.println("sub thread sequence of "  + j + ", loop of " + i);
		}
		
		flag = false;
		
		//唤醒其它正在等待的线程
		this.notify();
	}
	
	synchronized void main(int i) throws InterruptedException{
//		if(flag){
		//循环和if功能相仿,但更加完备
		while(flag){
			//使当前线程等待...
			this.wait();
		}
		
		for(int j = 1; j <= 100; j++){
			System.out.println("main thread sequence of "  + j + ", loop of " + i);
		}
		
		flag = true;
		
		//唤醒其它正在等待的线程
		this.notify();
	}
}

2、注意

      一、Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁相似,锁自己也应该是一个对象。两个线程执行的代码片断要实现同步互斥的效果,它们必须用同一个Lock对象。锁是上在表明要操做的资源的类的内部方法中,而不是线程代码中!算法

    二、使用wait与notify实现线程间(主线程和子线程)的通讯oop

    三、关于互斥分组的问题this

3、总结

       须要用到共同数据(包括同步锁)或共同算法的若干个方法应该归在同一个类中,这种设计正好体现了高类聚和程序的健壮性。spa