参考网址:https://blog.csdn.net/night_dragon/article/details/54409473
https://blog.csdn.net/huanyuminhao/article/details/51960256
1.顺序执行(先让子线程执行完毕,再继续执行主线程)
private Object obj = new Object();
private void test(){
new Thread(){
@Override
public void run() {
super.run();
try{
for (int a=0;a<10;a++){
System.out.println("输出A:"+a);
}
}catch (Exception e){
}finally {
synchronized (obj) {
obj.notify();
}
}
}
}.start();
try {
synchronized (obj) {
obj.wait();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int a=0;a<10;a++){
System.out.println("输出B:"+a);
}
}
打印结果
System.out: 输出A:0
System.out: 输出A:1
System.out: 输出A:2
System.out: 输出A:3
System.out: 输出A:4
System.out: 输出A:5
System.out: 输出A:6
System.out: 输出A:7
System.out: 输出A:8
System.out: 输出A:9
System.out: 输出B:0
System.out: 输出B:1
System.out: 输出B:2
System.out: 输出B:3
System.out: 输出B:4
System.out: 输出B:5
System.out: 输出B:6
System.out: 输出B:7
System.out: 输出B:8
System.out: 输出B:9
2.同步执行(子线程开始的时候,主线程正常运行)
private Object obj = new Object();
private void test(){
new Thread(){
@Override
public void run() {
super.run();
try{
for (int a=0;a<10;a++){
System.out.println("输出A:"+a);
}
}catch (Exception e){
}finally {
//synchronized (obj) {
// obj.notify();
//}
}
}
}.start();
//try {
// synchronized (obj) {
obj.wait();
// }
//} catch (InterruptedException e) {
// e.printStackTrace();
//}
for (int a=0;a<10;a++){
System.out.println("输出B:"+a);
}
}
打印结果
System.out: 输出B:0
System.out: 输出B:1
System.out: 输出B:2
System.out: 输出B:3
System.out: 输出B:4
System.out: 输出B:5
System.out: 输出A:0
System.out: 输出B:6
System.out: 输出A:1
System.out: 输出B:7
System.out: 输出A:2
System.out: 输出B:8
System.out: 输出A:3
System.out: 输出B:9
System.out: 输出A:4
System.out: 输出A:5
System.out: 输出A:6
System.out: 输出A:7
System.out: 输出A:8
System.out: 输出A:9
说明:给obj对象加锁后执行顺序:子线程开始---同时向下执行遇到了加锁的obj.wait(),主线程在这里释放锁并休眠等待,当子线程运行完之后(先进入try,执行完后,进入到finally,唤醒了对象锁),代码继续向下执行