关于《Java多线程编程核心技术》P113页的2.2.15内部类与同步:实验2

该实验结果在P115,图2-63 运行结果,该图可能存在一定的误导性,为了使实验结果更加清晰,请将InnerClass1中的method2方法中"j<10"改为"j<20".


类OutClass.java代码如下:

package org.goldwind.test;

/**
 * 类说明
 * 
 * @author 葛楠 [email protected]
 * @date 2017年12月4日 新建
 */
public class OutClass {

	static class InnerClass1 {
		public void method1(InnerClass2 class2) {
			String threadName = Thread.currentThread().getName();
			synchronized (class2) {
				System.out.println(threadName + " 进入InnerClass1类中的method1方法");
				for (int i = 0; i < 10; i++) {
					System.out.println("i=" + i);
					try {
						Thread.sleep(100);
					} catch (Exception e) {
						// TODO: handle exception
					}
				}
				System.out.println(threadName + " 离开InnerClass1类中的method1方法");
			}
		}

		public synchronized void method2() {
			String threadName = Thread.currentThread().getName();
			System.out.println(threadName + " 进入InnerClass1类中的method2方法");
			for (int j = 0; j < 20; j++) {
				System.out.println("j=" + j);
				try {
					Thread.sleep(100);
				} catch (Exception e) {
					// TODO: handle exception
				}
			}
			System.out.println(threadName + " 离开InnerClass1类中的method2方法");
		}
	}

	static class InnerClass2 {
		public synchronized void method1() {
			String threadName = Thread.currentThread().getName();
			System.out.println(threadName + " 进入InnerClass2 类中的method1 方法");
			for (int k = 0; k < 10; k++) {
				System.out.println("k=" + k);
				try {
					Thread.sleep(100);
				} catch (Exception e) {
					// TODO: handle exception
				}
			}
			System.out.println(threadName + " 离开 InnerClass2 类中的method1方法");
		}
	}

}

运行类Run.java代码如下:

package org.goldwind.test;

import org.goldwind.test.OutClass.InnerClass1;
import org.goldwind.test.OutClass.InnerClass2;

/**  
* 类说明   
*  
* @author 葛楠 [email protected] 
* @date 2017年12月5日  新建  
*/
public class Run {
	public static void main(String[] args) {
		final InnerClass1 in1 = new InnerClass1();
		final InnerClass2 in2 = new InnerClass2();
		Thread t1 = new Thread(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				in1.method1(in2);
			}
		},"T1");
		Thread t2 = new Thread(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				in1.method2();
			}
		}, "T2") ;
		Thread t3 = new Thread(new Runnable() {
			@Override
			public void run() {
				// TODO Auto-generated method stub
				in2.method1();
			}
		}, "T3");
		t1.start();
		t2.start();
		t3.start();
	}
}

运行结果如下:

T1 进入InnerClass1类中的method1方法
T2 进入InnerClass1类中的method2方法
i=0
j=0
i=1
j=1
j=2
i=2
j=3
i=3
j=4
i=4
j=5
i=5
j=6
i=6
j=7
i=7
i=8
j=8
j=9
i=9
j=10
T1 离开InnerClass1类中的method1方法
T3 进入InnerClass2 类中的method1 方法
k=0
k=1
j=11
j=12
k=2
k=3
j=13
k=4
j=14
k=5
j=15
k=6
j=16
k=7
j=17
k=8
j=18
k=9
j=19
T2 离开InnerClass1类中的method2方法
T3 离开 InnerClass2 类中的method1方法

说明:T1与T3同步,与T2异步。

猜你喜欢

转载自blog.csdn.net/gn1992/article/details/78717858