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

来源:互联网 发布:mac 泳道图 编辑:程序博客网 时间:2024/06/06 04:53

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


类OutClass.java代码如下:

package org.goldwind.test;/** * 类说明 *  * @author 葛楠 gnan1992@126.com * @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 葛楠 gnan1992@126.com * @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() {@Overridepublic void run() {// TODO Auto-generated method stubin1.method1(in2);}},"T1");Thread t2 = new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubin1.method2();}}, "T2") ;Thread t3 = new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubin2.method1();}}, "T3");t1.start();t2.start();t3.start();}}

运行结果如下:

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

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