public class Demo {
public static void main(String[] args) {
ThreadImpl thread = new ThreadImpl(new Object());
// 开启一个线程
thread.start();
}
}
class ThreadImpl extends Thread {
// 线程锁对象
private Object lock;
public ThreadImpl(Object lock) {
this.lock = lock;
}
// 重写线程的run方法,线程的业务执行逻辑
@Override
public void run() {
synchronized (lock) {
// 执行一个for循环,打印0~9之间的数字
for (int i = 0; i < 10; i++) {
System.out.println("当前数字为:" + i);
}
try {
// 调用wait方法控制线程
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
此部分代码由synchronized对代码块进行加锁操作。
当我们执行main方法的时候会报错java.lang.IllegalMonitorStateException。
但是我们在wait()方法之前加上 lock 之后就不会报错。
原因: 在对代码块、关键字、对象加锁操作之后,代码块、关键字、对象都是由锁进行管理的了。所以当我们直接调用wait()时,实际是线程等待。而不是锁等待。
注意:此类方法还有:notify(), notifyAll(),wait(), wait(long), wait(long, int)等线程控制操作方法。
其实也很好理解,假如你开启两个甚至三个以上的线程,在synchronized关键字中的锁对象均为lock,此时是你的锁对象lock在管理这些线程,因此在调用这些线程状态管理的方法时,调用者应该为你的锁对象。
在调用线程控制方法的时候,如果加锁了。那么就应该用锁调用,而不应该是线程调用!!!