Новое приложение для замораживания ниток

1

У меня есть приложение, которое довольно ресурсоемкое, оно использует большие изображения в качестве входных данных, и некоторые операции с этими изображениями могут занять некоторое время. Поэтому я стараюсь, чтобы некоторые части запускались в их собственных потоках. Для этого я использовал следующий код, чтобы сначала проверить:

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();

Когда я запускаю приложение, он зависает при вызове этого кода. Тем не менее, мне удалось заставить его работать один раз, я не уверен, что, но он работает отлично (не в первый раз, он застыл несколько раз, а затем случайно работал один раз). Я не изменил ни один из кода только некоторые из отступов и т.д., Чтобы он соответствовал остальной части кода и с тех пор, как он просто продолжает замораживаться. Действие кнопки нажимает этот метод, где приведенный выше код, как только нажатые кнопки замерзают.

Есть ли причина, почему это происходит?

заранее спасибо

Теги:
multithreading
concurrency

2 ответа

3

Вы вызываете код, не являющийся потоком (swing (не является потокобезопасным)) из обоих потоков (недавно созданного и основного потока) одновременно.

Перед созданием новых потоков убедитесь, что вы отделили логику.

В этом конкретном случае использования я предлагаю использовать SwingWorker вместо потоков, они просты в использовании и хорошо работают в пределах ограничений качания.

Подробнее о SwingWorker адресу http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

Надеюсь это поможет.
Удачи.

  • 0
    Хорошо спасибо. Просто из интереса, почему иногда кажется, что это работает, а потом нет? Есть ли какая-то причина, которая кажется мне довольно случайной на данный момент!
  • 0
    Ну, я полагаю, что магия скрыта под покровом методов обновления и setIndeterminate!
1

Трудно сказать точно, но я замечаю, что переменная greenImage и greenBand не объявлены нигде. Это заставляет меня думать, что они глобальные переменные. Если что-то еще имеет к ним доступ, возможно, что они вызывают некоторые манипуляции, которые отправляют ваш код в бесконечный цикл или другие неожиданные Bad Things.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню