该实验结果在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() {
@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异步。