這是我運行的Test.java文件的源碼,Sub類繼承的是Main類,MyThreadA和MyThreadB都是線程類
package service;
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Sub subRef = new Sub();
MyThreadA a = new MyThreadA(subRef);
a.setName("A");
a.start();
MyThreadB b = new MyThreadB(subRef);
b.setName("B");
b.start();
}
}
如下是控制臺的運行結(jié)果,我的疑問是為什么Main類里面的serviceMethod()方法也被調(diào)用了?線程MyThreadA和線程MyThreadB的run()方法不是只是調(diào)用了Sub類里面的serviceMethod()方法嗎?
int sub 下一步 sleep begin threadName=A time=1521894980829
int sub 下一步 sleep begin threadName=B time=1521894980829
int sub 下一步 sleep end threadName=A time=1521894985834
int sub 下一步 sleep end threadName=B time=1521894985834
int main 下一步 sleep begin threadName=A time=1521894985835
int main 下一步 sleep end threadName=A time=1521894990838
int main 下一步 sleep begin threadName=B time=1521894990838
int main 下一步 sleep end threadName=B time=1521894995840
如下是MyThreadA類
package service;
public class MyThreadA extends Thread {
private Sub sub;
public MyThreadA(Sub sub) {
super();
this.sub = sub;
}
@Override
public void run() {
// TODO Auto-generated method stub
sub.serviceMethod();
}
}
如下是MyThreadB類
package service;
public class MyThreadB extends Thread {
private Sub sub;
public MyThreadB(Sub sub) {
super();
this.sub = sub;
}
@Override
public void run() {
// TODO Auto-generated method stub
sub.serviceMethod();
}
}
如下是Main類
package service;
public class Main {
synchronized public void serviceMethod() {
try {
System.out.println("int main 下一步 sleep begin threadName="
+ Thread.currentThread().getName() + " time="
+ System.currentTimeMillis());
Thread.sleep(5000);
System.out.println("int main 下一步 sleep end threadName="
+ Thread.currentThread().getName() + " time="
+ System.currentTimeMillis());
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
如下是Sub類,繼承Main類
package service;
public class Sub extends Main {
@Override
public void serviceMethod() {
try {
System.out.println("int sub 下一步 sleep begin threadName="
+ Thread.currentThread().getName() + " time="
+ System.currentTimeMillis());
Thread.sleep(5000);
System.out.println("int sub 下一步 sleep end threadName="
+ Thread.currentThread().getName() + " time="
+ System.currentTimeMillis());
super.serviceMethod();
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
添加回答
舉報
0/150
提交
取消