Как в Java вызвать метод основного потока по окончании работы фонового? У меня есть функция поиска на карте памяти файлов определенного типа. Она занимает большое время и потому находится в фоновом потоке. После ее завершения мне необходимо вывести названия этих файлов на экран, а сделать я это могу только из основного потока. В итоге у меня возникает задача, по завершении фонового потока вызвать метод основного и метод join здесь не подойдет, т.к. мне нужно чтобы основной поток работал в то время, когда работает фоновый, а не ждал его окончания.
Для решения данной задачи можно воспользоваться классом SwingUtilities, который предоставляет методы для работы с графическим интерфейсом в Java.
Создайте класс, который будет выполнять поиск файлов определенного типа в фоновом потоке. Пусть этот класс будет реализацией интерфейса SwingWorker.import javax.swing.*; public class FileSearcher extends SwingWorker<Void, String> { @Override protected Void doInBackground() throws Exception { // Здесь выполняется поиск файлов определенного типа publish("file1.txt"); publish("file2.txt"); return null; } @Override protected void process(List<String> chunks) { for (String fileName : chunks) { // Публикуем найденные файлы System.out.println(fileName); } } }Теперь создайте основной поток и запустите в нем фоновый поток для поиска файлов.import javax.swing.*; public class MainThread { public static void main(String[] args) { SwingUtilities.invokeLater(() -> { FileSearcher fileSearcher = new FileSearcher(); fileSearcher.execute(); }); // Другие действия, которые будут выполняться в основном потоке } }
Таким образом, после завершения работы фонового потока метод process будет вызван в основном потоке и выведет названия найденных файлов на экран. А основной поток продолжит свою работу независимо от работы фонового потока.
Для решения данной задачи можно воспользоваться классом SwingUtilities, который предоставляет методы для работы с графическим интерфейсом в Java.
Создайте класс, который будет выполнять поиск файлов определенного типа в фоновом потоке. Пусть этот класс будет реализацией интерфейса SwingWorker.import javax.swing.*;public class FileSearcher extends SwingWorker<Void, String> {
@Override
protected Void doInBackground() throws Exception {
// Здесь выполняется поиск файлов определенного типа
publish("file1.txt");
publish("file2.txt");
return null;
}
@Override
protected void process(List<String> chunks) {
for (String fileName : chunks) {
// Публикуем найденные файлы
System.out.println(fileName);
}
}
}Теперь создайте основной поток и запустите в нем фоновый поток для поиска файлов.import javax.swing.*;
public class MainThread {
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
FileSearcher fileSearcher = new FileSearcher();
fileSearcher.execute();
});
// Другие действия, которые будут выполняться в основном потоке
}
}
Таким образом, после завершения работы фонового потока метод process будет вызван в основном потоке и выведет названия найденных файлов на экран. А основной поток продолжит свою работу независимо от работы фонового потока.