У меня есть приложение, которое довольно ресурсоемкое, оно использует большие изображения в качестве входных данных, и некоторые операции с этими изображениями могут занять некоторое время. Поэтому я стараюсь, чтобы некоторые части запускались в их собственных потоках. Для этого я использовал следующий код, чтобы сначала проверить:
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
вместо потоков, они просты в использовании и хорошо работают в пределах ограничений качания.
Подробнее о SwingWorker
адресу http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
Надеюсь это поможет.
Удачи.
Трудно сказать точно, но я замечаю, что переменная greenImage
и greenBand
не объявлены нигде. Это заставляет меня думать, что они глобальные переменные. Если что-то еще имеет к ним доступ, возможно, что они вызывают некоторые манипуляции, которые отправляют ваш код в бесконечный цикл или другие неожиданные Bad Things.