我正在做的是制作一个程序,该程序不断截取用户桌面的屏幕截图,并根据用户的需要保存它们。最初,我调用了在一段时间内捕获的方法,但这太慢了,我需要尽快拍摄尽可能多的图像。我决定做的是使用线程。
当程序运行时,我的电脑变得很慢(即鼠标闪烁、移动缓慢等),当我停止程序时,我收到以下错误。
Exception in thread "Thread-294" java.lang.OutOfMemoryError: Java heap space
at sun.awt.windows.WRobotPeer.getRGBPixels(Unknown Source)
at java.awt.Robot.createScreenCapture(Unknown Source)
at maple.Record.run(Record.java:29)
这是产生错误的行。
img = r.createScreenCapture(new Rectangle (0, 0, width, height));
这是我的包含线程的类。
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.media.MediaLocator;
public class Record implements Runnable {
Robot r;
static int width = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth();
static int height = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight();
BufferedImage img;
public static boolean stop = false;
public void run() {
try {
r = new Robot();
img = r.createScreenCapture(new Rectangle (0, 0, width, height));
ImageIO.write(img, "png", new File(JavCapture.tmpLocation + "\\tmp\\" + System.currentTimeMillis() + ".png"));
} catch (IOException | AWTException e) { e.printStackTrace(); }
}
}
当我调用已编辑为使用 .png 文件的 JpegImagesToMovies 时会产生错误。
请查看此链接以获取更多信息。
我该如何解决这个问题,以及如何让线程使用更少的内存,这样它就不会减慢 PC 的速度。
这是main方法中的调用。
do {
(new Thread(new Record())).start();
} while (!Record.stop);