powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Прервать поток
15 сообщений из 15, страница 1 из 1
Прервать поток
    #39376022
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо по таймауту прервать выполнение задачи.
Пока нарисовал такой тест
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
...
    public static void main(String[] args) throws InterruptedException {        
        ExecutorService es;        
        es = Executors.newFixedThreadPool(1);           
        es.execute(new NewTask());
        es.shutdown();       

        if (!es.awaitTermination(20, TimeUnit.SECONDS)) {
            System.out.println("Thread not finished in 20 seconds");
            System.exit(0);
        }    
        System.out.println("Successefully finished");
    }
...


Но думаю, что это негуманно при каждом запросе создавать пул потоков
(да еще при том, что всегда порождается только один поток). Есть ли более адекватные варианты?
...
Рейтинг: 0 / 0
Прервать поток
    #39376025
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сори, видимо, надо вместо newFixedThreadPool просто SingleThreadExecutor...
...
Рейтинг: 0 / 0
Прервать поток
    #39376067
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прервать поток или убить процесс и завершить выполнение программы?
По хорошему не нужно прервать достаточно сообщить что дальше выполнять ничего не нужно.

В Вашем примере нужно сохранить ссылку на NewTask и проинформировать его о том что уже хватит.
...
Рейтинг: 0 / 0
Прервать поток
    #39376071
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Другой вопрос если в Runnable вызывается чтото блокирующее, например http соединение с timeout в 3 минуты.

Как это все красиво организовать ?
...
Рейтинг: 0 / 0
Прервать поток
    #39376077
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,

Посмотри на методы Future.cancel() и Future.get(). Какое отношение метод main(String[] args) имеет к гуманизму и запросам, мне не очень понятно. Задача нужна для web?
...
Рейтинг: 0 / 0
Прервать поток
    #39376093
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczКакое отношение метод main(String[] args) имеет к гуманизму и запросам, мне не очень понятно. Задача нужна для web?
main - просто кусок тестового примера. Не только веб: таймаут при вызове NewTask может быть и до обращения к web.
...
Рейтинг: 0 / 0
Прервать поток
    #39376102
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
void init(){
     this.es = Executors.newCachedThreadPool();           
}

void close(){
     this.es.shutdown();
}

public <T> void runWithTimeout(Callable<T> task, Consumer<T> resultHandler, Runnable timeoutCallback) throws InterruptedException {        
    Future future = this.es.submit(task);
    try {
       T result = future.get(20, TimeUnit.SECONDS);
       resultHandler.consume(result);       
    } catch (TimeoutException te) {
       future.cancel(true);
       timeoutCallback.run();
    }
}
...
Рейтинг: 0 / 0
Прервать поток
    #39376103
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSmain - просто кусок тестового примера. Не только веб: таймаут при вызове NewTask может быть и до обращения к web.
М-да. Опять допрос с пристрастием. Если "не только веб", то кто же ещё? Если таймаут будет до обращения, то по какому событию NewTask вообще запускается???
...
Рейтинг: 0 / 0
Прервать поток
    #39376104
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Код: java
1.
 Future<T> future
...
Рейтинг: 0 / 0
Прервать поток
    #39376149
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не уточнил, ява5, там не нахожу Consumer.
Вариант с newCachedThreadPool c управлением внутри него потоками конечно интереснее, чем es.shutdown(); + es.awaitTermination.
BlazkowiczЕсли таймаут будет до обращения, то по какому событию NewTask вообще запускается???
Внутри NewTask есть методы, которые могут долго выполняться, кроме обращения к http.
...
Рейтинг: 0 / 0
Прервать поток
    #39376160
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDSНе уточнил, ява5, там не нахожу Consumer.
Ах, какая незначительная деталь. И как вас так угораздило? Java 6 я бы ещё с натяжкой мог понять. Но 5 - это за гранью. Да, она тупо медленне Java 7-8 процетов на 10 минимум.

JDSВариант с newCachedThreadPool c управлением внутри него потоками конечно интереснее, чем es.shutdown(); + es.awaitTermination.

Какое ещё "внутри"? Не нужно каждый раз создавать пул и убивать его только для того чтобы проверить состояние другого потока.

JDSВнутри NewTask есть методы, которые могут долго выполняться, кроме обращения к http.
Да, пофигу что там внутри. Краулер что ли пишешь?
...
Рейтинг: 0 / 0
Прервать поток
    #39376206
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczИ как вас так угораздило? Java 6 я бы ещё с натяжкой мог понять. Но 5 - это за гранью.
Так получилось )
BlazkowiczКакое ещё "внутри"? Не нужно каждый раз создавать пул и убивать его только для того чтобы проверить состояние другого потока.
Об том и речь, что так-то оно гораздо лучше конечно. Только все это еще крутится внутри БД и надо еще проверить как будет вести себя класс с этим пулом при обращении к нему из разных сессий, есть подозрение, что могут быть нюансы: например, если делать общий пул в классе, для всех сессий, то приведенным вначале способом es.shutdown() работать как бы не очень гуд (пока сделал через newSingleThreadExecutor, вроде пашет, но с пулом было бы конечно интереснее).
...
Рейтинг: 0 / 0
Прервать поток
    #39376211
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS Только все это еще крутится внутри БД
Ещё один совершенно незначительный нюанс.
...
Рейтинг: 0 / 0
Прервать поток
    #39376216
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JDS,

ИМХО, в таких случаях лучше задачу реализовать отдельным процессом, а из оракла дергать сервис хоть по RMI, хоть ещё как.
Можно тупак какой-нибудь налисопедить и без JUC

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
Thread t = new Thread(task);
t.start();
Thread.sleep(timeout);
if(!task.isComplete()){
    t.interrupt();
} else {
    process(t.getResult());
}
...
Рейтинг: 0 / 0
Прервать поток
    #39376246
JDS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczМожно тупак какой-нибудь налисопедить
Точно, спасиб. Переделаю на тупак )
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Прервать поток
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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