столкнулся с такой проблемой, у меня есть контейнер (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? У меня есть класс с несколькими статическими (и не только статическими) методами, которые мне нужно вызывать, возможно ли как-нибудь вызывать каждый в отдельном потоке, чтоб не грузить основной?
Буду рад вашим пояснениям. Заранее благодарю.
Потоки запускаются в методе 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
в рамках одного класса.
Если это принципиально разные методы, и их логика не имеет ничего общего, то для исключения взаимного влияния (они будут выполняться линейно в одном потоке, например) можно запускать их в разных потоках.
В данном случае, мне помогло
new Thread(new Runnable() {
@Override
public void run() {
//тут код
}
}).start();
и вот этот вариант
CompletableFuture.runAsync(() -> {
new LoaderDoc(selectedItem, listView).run();
});
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Как сделать так чтобы при нажатие на кнопку android приложения, выйти из приложения и поверх всех окон блокировать тач скрин, нажатие на экранА...
Есть приложение, которое начал писать на swingЗатем узнал, что график удобнее нарисовать с помощью JavaFx и JFXPanel Пробую пока примеры отсюда Сам...