我不精通多线程。我试图通过一个生产者线程重复截取屏幕截图,该线程将BufferedImage
对象添加到ConcurrentLinkedQueue
并且消费者线程将poll
排队等待BufferedImage
对象以将它们保存在文件中。我可以通过重复轮询(while 循环)来使用它们,但我不知道如何使用notify()
and来使用它们wait()
。我曾尝试在较小的程序中使用wait()
and notify
,但无法在此处实现。
我有以下代码:
class StartPeriodicTask implements Runnable {
public synchronized void run() {
Robot robot = null;
try {
robot = new Robot();
} catch (AWTException e1) {
e1.printStackTrace();
}
Rectangle screenRect = new Rectangle(Toolkit.getDefaultToolkit()
.getScreenSize());
BufferedImage image = robot.createScreenCapture(screenRect);
if(null!=queue.peek()){
try {
System.out.println("Empty queue, so waiting....");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
queue.add(image);
notify();
}
}
}
public class ImageConsumer implements Runnable {
@Override
public synchronized void run() {
while (true) {
BufferedImage bufferedImage = null;
if(null==queue.peek()){
try {
//Empty queue, so waiting....
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
bufferedImage = queue.poll();
notify();
}
File imageFile = getFile();
if (!imageFile.getParentFile().exists()) {
imageFile.getParentFile().mkdirs();
}
try {
ImageIO.write(bufferedImage, extension, imageFile);
//Image saved
catch (IOException e) {
tracer.severe("IOException occurred. Image is not saved to file!");
}
}
}
以前我有一个重复的轮询来检查BufferedImage
对象的存在。现在我改变了run
方法 assynchronised
并尝试实现wait()
and notify()
。我做得对吗?请帮忙。谢谢。