Java 如何使用锁定和一个条件暂停/恢复?
我正在尝试实现一个图像缓存系统,它将在向缓存中插入5个图像后暂停Java 如何使用锁定和一个条件暂停/恢复?,java,multithreading,concurrency,locking,conditional-statements,Java,Multithreading,Concurrency,Locking,Conditional Statements,我正在尝试实现一个图像缓存系统,它将在向缓存中插入5个图像后暂停 public void run() { int index = 0; lock.lock(); try { while (index < list.getJpegCount() && !bCancel) { String file = list.getJpeg(index); images.put(file,
public void run() {
int index = 0;
lock.lock();
try {
while (index < list.getJpegCount() && !bCancel) {
String file = list.getJpeg(index);
images.put(file,
ImageUtils.getThumbNail(list.getJpeg(index), size));
index++;
batchCount++;
Console.writeLine("Object cached: " + file);
if (batchCount > 5) {
try {
batchCount = 0;
Console.writeLine("Waiting for next batch...");
bufferEmpty.await();
Console.writeLine("We are back...");
} catch (InterruptedException ex) {
Logger.getLogger(JpegCache.class.getName()).log(
Level.SEVERE, null, ex);
}
}
}
} finally {
lock.unlock();
}
}
怎么了?解决方案:
我忘记开锁了:
public Image getNext()
{
lock.lock();
currentIndex++;
String filename=list.getJpeg(currentIndex);
if (!images.containsKey(filename))
{
bufferEmpty.signalAll();
lock.unlock();
Console.writeLine("Start next batch...");
return ImageUtils.getThumbNail(filename, size);
}else
{
lock.unlock();
return images.get(filename);
}
}
如何获得
bufferEmpty
条件?如:final Lock=new ReentrantLock();最终条件bufferEmpty=lock.newCondition();我最近在这里发布了一个机制。这可能很有趣。你的代码太复杂了。应该有一种更简单的方法使用监视器唤醒线程。您应该始终在finally块中解锁!
public Image getNext()
{
lock.lock();
currentIndex++;
String filename=list.getJpeg(currentIndex);
if (!images.containsKey(filename))
{
bufferEmpty.signalAll();
lock.unlock();
Console.writeLine("Start next batch...");
return ImageUtils.getThumbNail(filename, size);
}else
{
lock.unlock();
return images.get(filename);
}
}