我有一个资源密集型应用程序,它使用大图像作为输入,对这些图像的某些操作可能需要一段时间。因此,我希望让某些部分在它们自己的线程中运行。为此,我首先使用了以下代码进行测试:
Thread t1 = new Thread(new Runnable() {
public void run()
{
inputChooser.setFileFilter(filter);
inputChooser.addChoosableFileFilter(filter);
int img = inputChooser.showOpenDialog(this);
if (img == JFileChooser.APPROVE_OPTION) {
File file = inputChooser.getSelectedFile();
String filename = file.getName();
if (filename.contains("B10")) {
greenBand = 1;
}
if (filename.contains("B20")) {
greenBand = 2;
}
if (filename.contains("B30")) {
greenBand = 3;
}
if (filename.contains("B40")) {
greenBand = 4;
}
if (filename.contains("B50")) {
greenBand = 5;
}
if (filename.contains("B60")) {
greenBand = 6;
}
if (filename.contains("B70")) {
greenBand = 7;
}
try {
greenImage = ImageIO.read(file);
ImageIO.write(greenImage, "JPEG", new File("img2_tmp.jpeg"));
greenImage = ImageIO.read(new File("img2_tmp.jpeg"));
if (greenImage.getWidth() > 8000 | greenImage.getHeight() > 7000) {
greenImage = greenImage.getSubimage(1450, 1400, (greenImage.getWidth()-3200), (greenImage.getHeight()-3000));
}
update(greenImage, greenIcon, greenLabel);
loadingBar.setIndeterminate(false);
checkInput();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, "Input Image Error", "Input Error", WARNING_MESSAGE);
}
}
}});
t1.start();
当我运行应用程序时,它会在调用此代码时卡住。但是,我设法让它运行了一次,我不确定它是如何运行的(不是第一次,它先卡住了几次,然后随机运行了一次)。我没有更改任何代码,只是更改了一些缩进,以使其与其余代码相适应,而且自从它继续卡住以来。按下按钮操作会在上面的代码所在的位置调用此方法,一旦按下按钮,它就会卡住。
发生这种情况是否有原因?
提前致谢
最佳答案
您正在同时从两个线程(新创建线程和主线程)调用非线程安全代码(swing(不是线程安全的))。
确保在创建新线程之前已将逻辑解耦。
对于这个特定的用例,我建议您使用 SwingWorker
代替线程,它们易于使用,并且在 swing 的限制内工作良好。
有关 SwingWorker
的更多信息,请访问 http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
希望这对您有所帮助。
祝你好运。
关于java - 新线程卡住应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22466383/