之前的一篇文章《异步转同步之CountDownLatch》,介绍了用JAVA提供的CountDownLatch类来解决多线程同步的问题。这篇文章介绍用Object来解决同样问题
Object类是java的基类,所有的类都继承于Object。查找Object的API,我们会发现在Object类里面已经实现了多线程编程时需要的wait(), notifyAll()等方法
在代码中使用的两个步骤
1. 在需要阻塞的地方调用wait。如:在线程中需要等待另一个线程完成
synchronized(lock){
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
2. 需要唤醒其他线程时调用notifyAll。如:在运行此线程之前,我已经调用过了wait,当我完成了要做的事情之后,调用notifyAll来唤醒被阻塞的线程
synchronized(lock){
lock.notifyAll();
}
另外Object和AtomicBoolean配合使用,可以更好的控制线程
synchronized (stateLock) {
if (mIsRunning.get()) {
try {
stateLock.wait(DEFAULT_WAITTIME);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(mIsRunning.get())
return false;
}
mIsRunning.set(true);
mIsInterrupted.set(false);
}
这里的mIsRunnint、mIsInterrupted就是AtomicBoolean了