java线程通信面试题

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

代码如下:

/*
 *子线程循环5次,接着主线程循环10次,接着又回到子线程循环5次,然后再到主线程循环10次,如此反复执行5次;
 *synchronized解决线程互斥
 */
public class ThreadSyn {

	public static void main(String[] args) {

		final Loop loop = new Loop();

		// 子线程
		new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 1; i <= 5; i++) {
					loop.sun(i);
				}
			}
		}).start();

		// 主线程,mian方法本身就是一个主线程
		for (int i = 1; i <= 5; i++) {
			loop.mian(i);
		}
	}

}

class Loop {
	private boolean iswait = true;
     /*
      * 这里要注意wait和notify的用法,对象调用了wait方法就会使持有该对象的线程把该对象的控制权交出去,然后处于等待状态。
      * 任何一个时刻,对象的控制权(monitor)只能被一个线程拥有
      */
	public synchronized void sun(int i) {
		while (!iswait) {
			try {
				System.out.println("子线程等待。。。。。");

				this.wait();// 等待主线程执行结束
			} catch (InterruptedException e) {

				e.printStackTrace();
			}
		}
		
		for (int j = 1; j <= 5; j++) {
			System.out.println("子线程:" + j + "循环次数" + i);
		}
	    System.out.println("*******");
		iswait = false;
		
		this.notify();// 唤醒主线程
		System.out.println(" 唤醒主线程");
	}

	public  synchronized void mian(int i) {
		while (iswait) {
			try {
				System.out.println("主线程等待。。。。。");
				this.wait();// 等待子线程结束
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		for (int j = 1; j <= 10; j++) {
			System.out.println("主线程:" + j + "循环次数" + i);
		}
		System.out.println("^^^^^^^^^^");
		iswait = true;
	
		this.notify();// 唤醒子线程
		System.out.println(" 唤醒子线程");
	}
}
这里有2个注释不是很准,就是this.notify();这个方法我有点模糊,第一个notify按理来说应该是唤醒子线程,因为this在sun()方法里面,所以我这样认为的,不过this是代表当前对象,也就是Loop这个类,这里我就更晕了,Loop又不是一个线程,this.notify是咋回事呢,反正我这样写出来了,notify不清楚也没办法了,只能以后再慢慢弄懂了

你可能感兴趣的:(程序=算法+数据结构)