java-线程-线程同步通信技术

源代码如下

public class TranditionalThreadCommunication {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		final Business business = new Business();
		
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				
				for(int i = 0; i<50;i++){
					business.sub(i);
				}
			}
		}).start();

		for(int i = 0; i < 50; i++){
			business.main(i);
		}
	}
}

	/**
	 * 这个类是线程同步的
	 * @author gavinlin
	 *
	 */
	class Business{
		private boolean bShouldSub = true;
		
		public synchronized void sub(int i){
			while(bShouldSub){
				try {
					this.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			for(int j=0;j<10;j++){
				System.out.println("subThread" + j +"loop " + i);
			}
			bShouldSub = !bShouldSub;
			this.notify();
		}
		
		public synchronized void main(int i){
			while(!bShouldSub){
				try {
					this.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			for(int j=0;j<100;j++){
				System.out.println("mainThread" + j + "loop " + i);
			}
			bShouldSub = !bShouldSub;
			this.notify();
		}
	}

 

上面的代码干了什么?

1.主要看main方法,生成了一个Business类的对象(先不管business里是干什么用的),然后开一个线程,循环50次调用business.sub,主线程也循环50次调用business.main

2.看看business里面实现了什么,sub方法就是重复10次打印信息,main方法重复100次调用打印信息。两个方法都做了同步,bShouldSub判断是否该运行方法,wait方法和notify方法是这里的重点,作用是如果该方法不该运行就阻塞(运行wait),方法运行完调用notify(通知正在wait的方法可以往下执行了)。

3.根据1和2,可以得出其运行结果是调用同一个business时sub打印10次信息,再到main打印100次信息,重复上述步骤50次

posted on 2011-10-05 01:49  victorlinwen  阅读(558)  评论(0)    收藏  举报