📄 condvar.java
字号:
package thread.lock;
/**
* <p>Title:条件变量的使用 </p>
*
* <p>Description: </p>
*
* <p>Copyright: Copyright (c) 2004</p>
*
* <p>Company: netsky</p>
*
* @author wdz123@hotmail.com
* @version 1.0
*/
public class CondVar {
private BusyFlag SyncVar;
public CondVar() {
this(new BusyFlag());
}
public CondVar(BusyFlag sv) {
SyncVar = sv;
}
/**
* 相当于wait()方法
* ***/
public void cvWait() throws InterruptedException {
cvTimedWait(SyncVar, 0);
}
/**
* 相当于wait()方法
* ***/
public void cvWait(BusyFlag sv) throws InterruptedException {
cvTimedWait(sv, 0);
}
/**
* 相当于wait()方法
* ***/
public void cvTimedWait(int millis) throws InterruptedException {
cvTimedWait(SyncVar, millis);
}
/**
* 相当于wait()方法
* ***/
public void cvTimedWait(BusyFlag sv, int millis) throws InterruptedException {
int iThreadLockCount = 0;
InterruptedException errx = null;
synchronized (this) {
//判断此方法必须拥有锁
if (sv.getBusyFlagOwner() != Thread.currentThread()) {
// throw new InterruptedException("");
}
//完全地释放锁
while (sv.getBusyFlagOwner() == Thread.currentThread()) {
iThreadLockCount++;
sv.freeBusyFlag();
}
//使用wait()方法
try {
if (millis == 0) {
wait();
}
else {
wait(millis);
}
}
catch (InterruptedException ex) {
errx = ex;
}
//获取锁
for (; iThreadLockCount > 0; iThreadLockCount--) {
sv.getBusyFlag();
}
if (errx != null) {
throw errx;
}
}
}
/**
* 相当于notify()方法
* ***/
public void cvSignal() {
cvSignal(SyncVar);
}
/**
* 相当于notify()方法
* ***/
public synchronized void cvSignal(BusyFlag sv) {
//判断此方法必须拥有锁
if (sv.getBusyFlagOwner() != Thread.currentThread()) {
}
notify();
}
/**
* 相当于notifyAll()方法
* ***/
public void cvBroadcast() {
cvBroadcast(SyncVar);
}
/**
* 相当于notifyAll()方法
* ***/
public synchronized void cvBroadcast(BusyFlag sv) {
//判断此方法必须拥有锁
if (sv.getBusyFlagOwner() != Thread.currentThread()) {
}
notifyAll();
}
public static void main(String[] args) {
CondVar condvar = new CondVar();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -