Вопрос:

Потоковое Java-приложение

java

89 просмотра

2 ответа

14 Репутация автора

Я должен создать приложение Java, которое возвращает имена файлов PDF в каталогах и подкаталогах, используя потоки, и это было сделано. но кроме того, я должен распечатать его в алфавитном порядке. Я написал этот код, который сортирует результаты каждого потока, но не сортировал финальный результат.

public class Pdf extends Thread {

    File f;
    ArrayList<String> a = new ArrayList<>();

    public Pdf(File f, String name) {
        super(name);
        this.f = f;
    }
    ArrayList<String> a1 = new ArrayList<>();

    @Override
    public synchronized void run() {
        for (File file : f.listFiles()) {

            if (file.isFile() && file.getName().contains(".pdf")) {
                if (file.getName().charAt(0) >= 'a' && file.getName().charAt(0) <= 'z') {
                    Collections.sort(a);
                    a.add(file.getName());
                }

            }
            if (file.isDirectory()) {

                new Pdf(file, file.getName()).start();

            }
        }
        Collections.sort(a);
        Collections.reverseOrder();
        for (String l : a) {
            System.out.println(l);
        }
    }
}    
Автор: Kasoir Abbas Источник Размещён: 13.04.2017 06:01

Ответы (2)


2 плюса

45213 Репутация автора

Когда есть каталог, вы создаете новый thread. Этот поток вычисляет файлы и добавляет их в свой список локальных переменных. Список отсортирован для одного потока, но так как существует несколько разных списков для разных потоков, вы не можете получить отсортированный результат в целом. Кроме того, так как различные потоки будут работать отдельно, так что вы можете получить случайные выходные имена файлов.

Чтобы преодолеть это, вы можете сделать одно из следующих действий.

  1. Если вы используете отдельный поток, подобный этому, тогда используйте общий параллельный список, который можно отсортировать после завершения выполнения всех потоков.
  2. Лучше использовать одну нить. Здесь вместо создания отдельного потока для каждого подкаталога, просто создайте метод, который будет добавлять файлы в список и будет рекурсивно вызывать себя, когда есть подкаталог. В этом случае в конце потока вы можете отсортировать список и распечатать его.

Также одна другая заметка, если вы хотите изменить список, то вам нужно позвонить Collections.reverseOrder(a)

Автор: stinepike Размещён: 13.04.2017 06:09

1 плюс

50 Репутация автора

Вам понадобится коллекция, в которую все потоки добавят свои результаты. Убедитесь, что эта коллекция синхронизирована. В противном случае коллекция может «сломаться». Затем вы должны дождаться окончания всех потоков. После этого вы должны отсортировать коллекцию, в которую они добавили, и вернуть ее.

Автор: Andrew Cahill Размещён: 13.04.2017 06:49
Вопросы из категории :
32x32