2009-09-01 2 views
2

У меня есть фильтр сервлетов, который несет некоторую логику и производит вывод, прежде чем запрос будет обслуживаться основной страницей. У меня возникла новая необходимость отправки вывода на несколько секунд позже, чем в момент ее создания (с задержкой ~ 10 с). Из-за некоторых неудачных вариантов дизайна, сделанных ранее, я не могу переместить положение фильтра только для того, чтобы отправить результат.Java thread start() без join() или interrupt() в сервлет

Я выбрал, чтобы создать поток и задержать передачу сообщения там. В настоящее время я не предпринимаю никаких явных шагов, чтобы остановить выполнение этого потока. Я не уверен, что все правильно очищается. Должен ли я использовать функции join() или interrupt() или любые другие методы Thread для безопасной очистки после этого?

Таким образом, внутри основного кода сервлета У меня есть что-то вроде этого ...

Thread t = new Thread(new MessageSender(message, 10000)); 
t.start(); 
//Carry on.. la la la 

Хотя существуют и другие поля в этом классе, я просто раздели много несущественные вещи, как установление связей БД и т. д., чтобы сделать точку понятной.

private static class MessageSender implements Runnable { 
    String message; 
    int delay; 

    public MessageSender(String message, int delay) { 
     this.message = message; 
     this.delay = delay; 
    } 

    public void run() { 
     try { 
      Thread.sleep(delay); 
      System.out.println(new java.util.Date() + ": hello world");     
     } catch (InterruptedException e) { 
      // Do blah 
     } catch (Exception e) { 
      // Do blah blah 
     } finally { 
      // Close connections and stuff 
     } 
    } 
} 

ответ

1

Да, все будет правильно очищено. Нить умирает после завершения метода run(), и поскольку у вас больше нет ссылок на этот объект потока, он будет правильно собран в мусор.

Просто убедитесь, что объект «Thread t» не будет ссылаться ни на что. Чтобы убедиться в этом, вы можете использовать: (новая тема (...)). Start();

4

Ваш код должен быть точным, ВМ очистит поток после его завершения.

Однако я бы посоветовал не использовать такие необработанные потоки, но вместо этого использовать java.util.concurrent.ScheduledExecutorService, создавая с помощью java.util.concurrent.Executors. Это более привлекательная абстракция, которая лучше контролирует распределение потоков.

1

Спецификация сервлета явно заявляет (раздел «Безопасность потоков»), что объекты запроса и ответа не гарантируются потокобезопасностью и что если эти объекты передаются другим потокам, то приложение отвечает за обеспечение того, чтобы эти объекты синхронизированы и доступ к ним осуществляется только в рамках метода службы сервлета. Другими словами, вы должны .join() те потоки.

0

Я просто должен был ответить на тот же вопрос сам :)

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

В Unix-системе вы можете использовать команду ps, но я ржавый, поэтому я попросил Google вместо чтения man-страницы. Одним из первых хитов на Google было This script that lists threads for each process. Результат выглядит следующим образом

PID TID CLS RTPRIO STAT COMMAND WCHAN 
.... 
16035 16047 TS - S (java) 
16035 16050 TS - S (java) 
16035 16054 TS - S (java) 
16035 16057 TS - S (java) 
16035 16058 TS - S (java) 
16035 16059 TS - S (java) 
16035 16060 TS - S (java) 
.... 

И я просто grep выход для идентификатора процесса (PID) процесса, я хочу, чтобы посмотреть и посчитать количество строк, каждый из которых соответствует нити. Например:

[email protected]: ~$ sh /tmp/list_threads.sh | grep 16035 | wc -l 
20 

Таким образом, программа, которую я просматриваю (PID 16035), имеет 20 потоков.

Для этого не нужно jconsole или любые изменения кода. Последняя часть, вероятно, самая важная часть, поскольку я сам не написал программу, поэтому теперь мне не нужно читать и понимать программу.

Смежные вопросы