Ben*_*Ben 15 java concurrency atomic java.util.concurrent
我正在寻找一种暂停线程的方法.
我开始有效地使用布尔标志(称为'暂停'),并使用while循环(暂停)包装检查.
在while循环中,有一个Thread.wait()阻止执行.
我一直在看AtomicBoolean,除了它不会阻止之外,它似乎可以解决这个问题.
是否有替代或扩展版本的AtomicBoolean有一个块方法?
即喜欢AtomicBoolean.getFalse()的东西AtomoicBoolean.get(false)?
它们具有阻塞队列,因此具有阻塞值.
目前的设置是:
while (paused.get()) {
synchronized (paused) {
try {
paused.wait();
} catch (Exception e) {
}
paused.notify();
}
}
Run Code Online (Sandbox Code Playgroud)
同
public void pause() {
if (paused.compareAndSet(false, true)) {
synchronized (paused) {
paused.notify();
}
}
}
public void resume() {
if (paused.compareAndSet(true, false)) {
synchronized (paused) {
paused.notify();
}
}
}
Run Code Online (Sandbox Code Playgroud)
Mis*_*ith 12
AtomicBoolean lock = new AtomicBoolean(false);
if(lock.compareAndSet(false, true)){
try {
//do something
} catch(Exception e){
//error handling
} finally {
lock.set(false);
}
}
Run Code Online (Sandbox Code Playgroud)
首先,除非你使用原子操作(类似于测试和设置),否则与AtomicBoolean常规布尔值一样无用(如果它们是可变的).我在这里使用compareAndSet,所以只有在旗帜下降时它才进入临界区.记得永远解锁.
要使用标志暂停线程,请不要进行主动等待(线程主体中的某个循环询问"我暂停了吗?"),因为这不是一种有效的做法.我会使用等待通知方案.当线程没有更多工作要做时,它会调用wait某个对象.然后,要重新启动,其他一些线程会调用notify同一个对象.
如果你想立即暂停(就设置标志时的跳过执行而言),你可以在尽可能多的步骤中划分代码,并用测试包装每个代码,最后等待暂停:
public void run(){
while(true){
if(!paused){
//do something
}
if(!paused){
//do something
}
if(!paused){
//do something
}
if(!paused){
//do something
}
if(paused){
//wait on some object
}
}
}
Run Code Online (Sandbox Code Playgroud)
根据您的代码,这些步骤甚至可以嵌套,或者包括涉及多个步骤的不可分割的执行单元.
使用CountDownLatch1:
CountDownLatch conditionLatch = new CountDownLatch(1);
Run Code Online (Sandbox Code Playgroud)
在您要等待某种条件变为真的地方:
conditionLatch.await();
Run Code Online (Sandbox Code Playgroud)
在您要将条件设置为true的地方:
conditionLatch.countDown();
Run Code Online (Sandbox Code Playgroud)