Swing & многопоточность

 
 
 
Сообщения:96
Помогите разобраться с многопоточностью.
Сваял не большую прогу на Swing.
В программе выбираешь каталог и она рекурсивно проходит каталог и печатает все файлы (пути) в TextArea.
Задача остановить обход до того как он закончиццо.
В общем запихнул алгоритм обхода в отдельный поток. В этот же самый поток добавил конструкцию
textArea.append(file.getAbsoltePath())

Поток прерываю путем вызова метода interrupt().
Для чего в методе run добавил конструкцию:
while (!Thread.currentThread().isInterrupted() && fl) {
                    fl = calc(this.path);
}

В общем все работает.
Программа обходит каталог рекурсивно.
Результат печатает в textArea.
Если нажать кнопку Stop, то работа останавливается.
Все как я и хотел, но когда нажимаешь кнопку Stop появляется исключение:
xception in thread "Thread-0" java.lang.Error: Interrupted attempt to aquire write lock
	at javax.swing.text.AbstractDocument.writeLock(AbstractDocument.java:1349)
	at javax.swing.text.AbstractDocument.insertString(AbstractDocument.java:702)
	at javax.swing.text.PlainDocument.insertString(PlainDocument.java:130)
	at javax.swing.JTextArea.append(JTextArea.java:477)
	at javaapplication6.Main$SimpleRunner.calc(Main.java:236)


Как правильно организовать работу с потоками?
 
 
Сообщения:90
исключение ожидаемо, в данном случае нужно обработать (написать блок try-catch) исключение, чтобы все было корректно - сделал прерывание, получил исключительную ситауцию (так и должно быть), обработал ее и закончил работу потока..

я не сильно копал в этом направлении и точно не помно зависает ли поток, после такого исключения в твоем случае или все таки прекращает работу..
чтобы не заморачиваться с таким (как мне кажется низкоуровневым флагопреставлением) я делал проще - написал класс для запуска и остановки потоков, будущий "поток" запускается на основе runnable объекта с помощью ScheduledExecutorService, а контролируется(останавливается) он посредством ScheduledFuture
 
 
Сообщения:75
Сделайте в классе с потоком поле
boolean running;


а в коде
public void run(){
   running = true;
   while(running && fl){
      // Код
      }
}


сеттером устанавливайте running в false из другого потока.

"Мы же профессионалы! Мы всегда делаем чуть больше, чем требуется!" (с)
 
 
Сообщения:96
все равно не получается.
Добавил в класс MyRunner поле running типа boolean.
Переписал метод run так:
while (running && fl) {
             ...
            }


Добавил в класс MyRunner метод
public void stopped() {
            this.running = false;
        }


Далее в при нажатии по кнопке Stop вызываю этот метод в надежде остановить поток.
Но поток не останавливается. :(
 
 
Сообщения:75
Покажите весь код класса с потоком.

"Мы же профессионалы! Мы всегда делаем чуть больше, чем требуется!" (с)
 
 
Сообщения:96
private class MyRunner implements Runnable {

        private final String path;
        private boolean running;

        public MyRunner(String path) {
            this.path = path;
            running = true;
        } 
        private boolean listDirectory(File file) {
            
            File[] files = file.listFiles();
            for (File item : files) {
                if(item.isDirectory()) listDirectory(item);
                areaResult.append("\r\n");
                areaResult.append(item.getAbsolutePath());
            }
            return false;
        }
        public void stopped() {
            this.running = false;
        }
        
        @Override 
        public void run() {
            boolean fl = true;
            while (running && fl) {
                
                    fl = listDirectory( new File(path));
                    
            }
        }
    }
 
 
Сообщения:75
У вас тут два цикла, один while, а другой foreach.
Первый похоже, что не нужен, а во второй можно добавить проверку running.
Типа такого

    private class MyRunner implements Runnable {
     
            private final String path;
            private boolean running;
     
            public MyRunner(String path) {
                this.path = path;
                running = true;
            } 
            private void listDirectory(File file) {
                
                File[] files = file.listFiles();
                for (File item : files) {
                    if(item.isDirectory()) listDirectory(item);
                    areaResult.append("\r\n");
                    areaResult.append(item.getAbsolutePath());
                    if(!running) break;
                }
            }
            public void stopped() {
                this.running = false;
            }
            
            @Override 
            public void run() {
                 running = true;
                 listDirectory( new File(path));   
            }
        }


Не проверял в IDE, но суть понятна.

"Мы же профессионалы! Мы всегда делаем чуть больше, чем требуется!" (с)
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет