powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Потоки Java (Callable)
19 сообщений из 19, страница 1 из 1
Потоки Java (Callable)
    #39065273
Helen_Cobskee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброго времени суток, ребят!
Со стороны клиента обращаюсь за данными к серверу (gwt).
Есть таблица grid, по нажатию на какую-то строку проиисходит передача id в функцию, которая должна по этому ключу найти данные в другой таблице из бд.
Данные типа bytea - могут быть большие размеры.
Вот поэтому нужно создать поток, чтобы при нажатии на другую строку таблицы не глючило все.

В общем, вопрос касается завершения созданного потока для получения данных из бд

Код: java
1.
2.
3.
4.
5.
6.
7.
 executorService = new ThreadPoolExecutor(1, 1, 2, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100));

            FileDownloadThread.getInstance().setThreadParameters(imageBytes, eventId, currentUserId, servlet);
            future = executorService.submit(FileDownloadThread.getInstance());

            list = future.get();
        return list;



Сам класс FileDownloadThread implement Callable<List<PrintedImages>>

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
 @Override
    public List<PrinterImages> call() throws Exception {

            list = new ArrayList<>();
            List<String> namesList;
            namesList = ServicesFactory.INSTANCE.getFilesAttachService().ProccessEMF(imageBytes, "Printer_", eventId, currentUserId, servlet);
            for (int i = 0; i < namesList.size(); i++) {
                String name = nameList.get(i).getName();
                list.add(new PrinterImages(i + name,
                        "/" + name));
            }

        return list;
    }




И вопрос: можно ли и как остановить поток (предыдущий, если к примеру слишком долго затянулся), при нажатии на другую строку grid?

Спасибо всем!
...
Рейтинг: 0 / 0
Потоки Java (Callable)
    #39065279
Helen_Cobskee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сама пыталась, interrupt, executorservice.shutDown(), но чтение данных из бд по функции ProcessEMF(...) не прекращается
...
Рейтинг: 0 / 0
Потоки Java (Callable)
    #39065313
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Helen_CobskeeСо стороны клиента обращаюсь за данными к серверу (gwt).
Есть таблица grid, по нажатию на какую-то строку проиисходит передача id в функцию, которая должна по этому ключу найти данные в другой таблице из бд.

А проблему обязательно решать на сервере? Почему просто не разрулить её на клиенте? Обрабатывать долгоиграющие функции особым образом не блокируя всю страницу?

Helen_Cobskee
Код: java
1.
2.
3.
4.
5.
6.
7.
 executorService = new ThreadPoolExecutor(1, 1, 2, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(100));

            FileDownloadThread.getInstance().setThreadParameters(imageBytes, eventId, currentUserId, servlet);
            future = executorService.submit(FileDownloadThread.getInstance());

            list = future.get();
        return list;



Этот код лишен смысла, потому что Future.get() блокирует текущий поток до конца выполнения задачи. То есть поток, обрабатывающий запрос от клиента просто работает ещё дольше, чем он бы делал это без ExecutorService

Helen_CobskeeИ вопрос: можно ли и как остановить поток (предыдущий, если к примеру слишком долго затянулся), при нажатии на другую строку grid?

Вам стоит отделить клиент от сервера для начала. Уж сильно вы их мешаете. В реальности же GWT это JavaScript, который шлет HTTP запросы на Java сервер. Это физически очень разные процессы.
...
Рейтинг: 0 / 0
Потоки Java (Callable)
    #39065325
Helen_Cobskee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
физически у меня разделены клиент и сервер, здесь получилось смешано (куски из кода)


BlazkowiczА проблему обязательно решать на сервере? Почему просто не разрулить её на клиенте? Обрабатывать долгоиграющие функции особым образом не блокируя всю страницу?

А как на клиентской стороне это сделать?
...
Рейтинг: 0 / 0
Потоки Java (Callable)
    #39065345
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Helen_Cobskee,

Хорошо бы разобраться с чего там грид вообще заблокировался. Используйте Scheduler, например. Произошло действие, отправили запрос на сервер и работаем дальше с гридом. Пришел отклик - обновили данные на UI.
...
Рейтинг: 0 / 0
Потоки Java (Callable)
    #39065355
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Helen_Cobskeeфизически у меня разделены клиент и сервер, здесь получилось смешано (куски из кода)

Ну, тогда не понятно какую проблему вы пытаетесь решить.
Есть грид на клиенте. Он блокируется долгоработающей задачей и ждет сервер.
Вы придумали запустить какой-то поток на сервере. Для чего? Как он решит проблему? Чтобы его потом прервать? С тем же успехом можно прервать и текущий поток, зачем новый запускать?

И затем вы задаёте вопрос уже по своему решению, как же прервать поток, хотя прерывание потока никак проблему блокировки UI вообще не решает.
...
Рейтинг: 0 / 0
Потоки Java (Callable)
    #39065358
Helen_Cobskee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
Глючит из-за того, что в потоке выполняется чтение данных, если сделать первый клик на записи, где тяжелые bytea, то первые несколько секунд спокойно выполняется и другие нажатия (на менее тяжелые данные bytea), а дальше все виснет до тех пор пока не выполнится полностью тот первый поток.
...
Рейтинг: 0 / 0
Потоки Java (Callable)
    #39065361
Helen_Cobskee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

BlazkowiczНу, тогда не понятно какую проблему вы пытаетесь решить.
Есть грид на клиенте. Он блокируется долгоработающей задачей и ждет сервер.
Вы придумали запустить какой-то поток на сервере. Для чего? Как он решит проблему? Чтобы его потом прервать? С тем же успехом можно прервать и текущий поток, зачем новый запускать?

И затем вы задаёте вопрос уже по своему решению, как же прервать поток, хотя прерывание потока никак проблему блокировки UI вообще не решает.

ясно
...
Рейтинг: 0 / 0
Потоки Java (Callable)
    #39065362
Helen_Cobskee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
тогда Scheduler с таймером?
...
Рейтинг: 0 / 0
Потоки Java (Callable)
    #39065365
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Helen_CobskeeГлючит из-за того, что в потоке выполняется чтение данных, если сделать первый клик на записи, где тяжелые bytea, то первые несколько секунд спокойно выполняется и другие нажатия (на менее тяжелые данные bytea), а дальше все виснет до тех пор пока не выполнится полностью тот первый поток.
Не понятно ровным счетом ничего. Давайте начнем с того, что на клиенте (GWT) - один поток. Поэтому что такое первый поток, а что последний - не понятно. Речь о запросах на сервер?
...
Рейтинг: 0 / 0
Потоки Java (Callable)
    #39065369
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Helen_CobskeeBlazkowicz,
тогда Scheduler с таймером?
Вместо того чтобы загадками говорить показали бы уже ваш GWT код, который тормозит.
С сервером-то всё ясно - запрос\ответ.
...
Рейтинг: 0 / 0
Потоки Java (Callable)
    #39065371
Helen_Cobskee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz Речь о запросах на сервер?

Да
...
Рейтинг: 0 / 0
Потоки Java (Callable)
    #39065390
Helen_Cobskee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
Есть таблица grid, по ней происходит клик, тогда вызывается метод из другого класса для отображения на панели данных

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
inputOutPutGridPanel.addRowClickHandler(new RowClickEvent.RowClickHandler() {
            @Override
            public void onRowClick(RowClickEvent event) {
                eventNotePanel.setEvent(inputOutPutGridPanel.getSelectedItem());
                if ((
                         (Objects.equals(selectedDataType, isPrinter))
                        )&&(inputOutPutGridPanel != null)) {
                    if (inputOutPutGridPanel.getSelectedItem() != null) {
                            detail.setCurrentEvent(inputOutPutGridPanel.getSelectedItem(),EventHandler.getInstance().selectedTreeAgentId);
                    }
                }
            }
        });



detail, в свою очередь, это компонента для отображения двоичных данных

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 public void setCurrentEvent(InfoEvent currentEvent, long selectedAgentTreeId)
    {   initEventHandler(inOutContentClient);
       

        if (currentEvent.getEventType().equals("PRINTER")) {
            listViewExample.initializeStore(currentEvent);
        }

       
        }
    }



ListView реализуется в другом классе, а инициализация происходит процедурой:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
     public void intializeStrore(InfoEvent)
{
           
      proxy = new RpcProxy<Object, List<PrinterImages>>() {
               @Override
               public void load(Object loadConfig, AsyncCallback<List<PrinterImages>> callback) {
                   Service.INFOPERIMETR.getPrinterImagesUrls(event.getId(), callback);
               }
           };

           loader = new Loader<Object, List<PrinterImages>>(proxy);

           ModelKeyProvider<PrinterImages> keyProvider = new ModelKeyProvider<PrinterImages>() {
               @Override
               public String getKey(PrinterImages item) {
                   return item.getName();
               }
           };

           store = new ListStore<PrinterImages>(keyProvider);

           loader.addLoadHandler(new ListStoreBinding<Object, PrinterImages, List<PrinterImages>>(store));
           loader.load();
           listView.setStore(store);
           panel.forceLayout();
}
...
Рейтинг: 0 / 0
Потоки Java (Callable)
    #39065391
Helen_Cobskee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот при нажатии на grid будет глючить, если оказалось, что данные слишком тяжелые
...
Рейтинг: 0 / 0
Потоки Java (Callable)
    #39065393
Helen_Cobskee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
Service.INFOPERIMETR.getPrinterImagesUrls(event.getId(), callback);



это обращение на сервер по id, отсюда и пойдут уже выше указанные процессы (поток Callable, ExecutorService ит.д.)
...
Рейтинг: 0 / 0
Потоки Java (Callable)
    #39065409
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Helen_Cobskee,

Обратите внимание как в этом примере
https://www.sencha.com/examples/#ExamplePlace:remotefiltergrid
метод Loader.load() завернут в Scheduler
...
Рейтинг: 0 / 0
Потоки Java (Callable)
    #39065456
Helen_Cobskee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
зависания не происходит, но и выполнение предыдущего (если он затянулся) обращения тоже не прекращается
...
Рейтинг: 0 / 0
Потоки Java (Callable)
    #39065458
Helen_Cobskee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
но это наверно так и должно быть?
...
Рейтинг: 0 / 0
Потоки Java (Callable)
    #39065479
Helen_Cobskee
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
Спасибо большое )
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Потоки Java (Callable)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]