Запуск метода в новом потоке Java

80
05 апреля 2022, 10:20

столкнулся с такой проблемой, у меня есть контейнер (ListView) и я читаю в него файл, ну соответственно, когда файл большой программа виснет. Что этого не случалось, я пытался сделать многопоточность, но что-то не так понял видимо и не могу вызвать саму функцию в отдельном потоке. Вот что получилось у меня.

ObservableList<String> lines = FXCollections.observableArrayList();
ListView<String> listView = new ListView<>(lines);
LoaderDoc loaderDoc = new LoaderDoc();
loaderDoc.start();
loaderDoc.loadDoc (selectedItem, listView); //отправляю сюда listView, чтоб он наполнился данными из файла.
Tab tab = new Tab(selectedItem.getValue().getName());

В классе LoaderDoc

public class LoaderDoc extends Thread {

    public void run() {
        System.out.println("Thread LoaderDoc run!");
    }
    public void loadDoc(TreeItem<File> selectedItem, ListView<String> listView) {
        /*ObservableList<String> lines = FXCollections.observableArrayList();
       // ListView<String> listView = new ListView<>(lines);*/
        listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
        listView.setCellFactory(TextFieldListCell.forListView());
        listView.setOnEditCommit(new EventHandler<ListView.EditEvent<String>>() {
            @Override
            public void handle(ListView.EditEvent<String> t) {
                listView.getItems().set(t.getIndex(), t.getNewValue());
            }
        });
        listView.setEditable(true); // change
        listView.getItems().clear();
        int numRom = 0;
        try {
            BufferedReader in = new BufferedReader(new FileReader(selectedItem.getValue().getAbsolutePath()));
            String s;
            while ((s = in.readLine()) != null) {
                numRom++;
                listView.getItems().add(numRom + ": " + s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Так же возникли следующие вопросы по многопоточке. Многопоточен только метод run? У меня есть класс с несколькими статическими (и не только статическими) методами, которые мне нужно вызывать, возможно ли как-нибудь вызывать каждый в отдельном потоке, чтоб не грузить основной?

Буду рад вашим пояснениям. Заранее благодарю.

Answer 1

Потоки запускаются в методе run() интерфейса Runnable

ObservableList<String> lines = FXCollections.observableArrayList();
ListView<String> listView = new ListView<>(lines);
Thread thread = new Thread(new LoaderDoc(selectedItem, listView));
thread.start(); //отправляю сюда listView, чтоб он наполнился данными из файла.
Tab tab = new Tab(selectedItem.getValue().getName());

Сам класс потока

public class LoaderDoc implements Runnable {
        private TreeItem<File> selectedItem;
        private ListView<String> listView;
        public LoaderDoc(TreeItem<File> selectedItem, ListView<String> listView) {
            this.selectedItem = selectedItem;
            this.listView = listView;
        }
        public void run() {
            System.out.println("Thread LoaderDoc run!");
            loadDoc(selectedItem, listView);
        }
        private void loadDoc(TreeItem<File> selectedItem, ListView<String> listView) {
        /*ObservableList<String> lines = FXCollections.observableArrayList();
       // ListView<String> listView = new ListView<>(lines);*/
            listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
            listView.setCellFactory(TextFieldListCell.forListView());
            listView.setOnEditCommit(new EventHandler<ListView.EditEvent<String>>() {
                @Override
                public void handle(ListView.EditEvent<String> t) {
                    listView.getItems().set(t.getIndex(), t.getNewValue());
                }
            });
            listView.setEditable(true); // change
            listView.getItems().clear();
            int numRom = 0;
            try {
                BufferedReader in = new BufferedReader(new FileReader(selectedItem.getValue().getAbsolutePath()));
                String s;
                while ((s = in.readLine()) != null) {
                    numRom++;
                    listView.getItems().add(numRom + ": " + s);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
}

В этом классе мы создали конструктор, чтобы передать в него необходимые объекты/параметры, которые присваиваем приватным полям класса, а их (приватные поля) в свою очередь уже передаем в метод loadDoc(), который запустим в методе run().

То, что мы сейчас сделали, это не многопоточность, это параллельный поток. Многопоточность - это немного другое, изучите этот вопрос.

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

Если методы выполняют работу для одного результата и вас устроит, что они будут выполнены линейно, то их можно запустить в одном методе run в рамках одного класса.

Если это принципиально разные методы, и их логика не имеет ничего общего, то для исключения взаимного влияния (они будут выполняться линейно в одном потоке, например) можно запускать их в разных потоках.

Answer 2

В данном случае, мне помогло

    new Thread(new Runnable() {
            @Override
            public void run() {
            //тут код
            }
        }).start();

и вот этот вариант

CompletableFuture.runAsync(() -> {
new LoaderDoc(selectedItem, listView).run();
});
READ ALSO
Как заблокировать любые нажатия на экран и при этом оставлять телефон включенным?

Как заблокировать любые нажатия на экран и при этом оставлять телефон включенным?

Как сделать так чтобы при нажатие на кнопку android приложения, выйти из приложения и поверх всех окон блокировать тач скрин, нажатие на экранА...

144
Как ищутся методы в суперклассе?

Как ищутся методы в суперклассе?

Объясните, пожалуйста, почему нижележащий код выводит:

152
JFXPanel в Swing приложении

JFXPanel в Swing приложении

Есть приложение, которое начал писать на swingЗатем узнал, что график удобнее нарисовать с помощью JavaFx и JFXPanel Пробую пока примеры отсюда Сам...

164