2013-06-25 4 views
1

Как запустить другой поток из сервлета? У меня есть код ниже в методе init() сервлета.Как запустить другой поток в сервлет?

FileThread myThread = new FileThread(); 
myThread.start(); 
myThread.run();  

Файл FileThread должен видеть папку, в которой необходимо проверить, были ли файлы изменены или нет. Таким образом, этот поток запускается в цикле. Но это не работает, как я ожидал. Он зависает (сервер не возвращает HTML) службу сервера.

Я хочу, чтобы эта нить работала на фоне и не мешала процессу сервлета. Как я могу добиться этого?

+6

Отмечено должно быть что крайне сложно создавать нерегулярные потоки в контейнере Java EE. Начните здесь: http://stackoverflow.com/questions/8327880/can-i-spawn-new-threads-in-jsp/8328113#8328113 – BalusC

ответ

6

Обычно вы не вызываете .run() на Thread, так как он будет делать метод run() для текущей темы, а не для новой темы! Вы сказали, что у вас бесконечный цикл, поэтому сервлет никогда не завершит инициализацию, поэтому он не будет обслуживать какие-либо запросы!

Вам необходимо просто позвонить .start() на объект Thread. Этот метод заставит JVM запустить новый поток выполнения, который будет запускать код в методе run() этого объекта Thread.

+0

+1 - Пригвожден! Вызов 'run()' означает, что поток сервлета теперь будет «выполнять операцию», который должен выполняться рабочим потоком. –

5

Запуск собственных потоков может быть не самой рекомендуемой вещью в веб-среде, а в Java EE, это на самом деле против спецификации.

Servlet 3.0 имеет поддержку Async, больше here

Например

@WebServlet("/foo" asyncSupported=true) 
    public class MyServlet extends HttpServlet { 
     public void doGet(HttpServletRequest req, HttpServletResponse res) { 
      ... 
      AsyncContext aCtx = request.startAsync(req, res); 
      ScheduledThreadPoolExecutor executor = new ThreadPoolExecutor(10); 
      executor.execute(new AsyncWebService(aCtx)); 
     } 
    } 

    public class AsyncWebService implements Runnable { 
     AsyncContext ctx; 
     public AsyncWebService(AsyncContext ctx) { 
      this.ctx = ctx; 
     } 
     public void run() { 
      // Invoke web service and save result in request attribute 
      // Dispatch the request to render the result to a JSP. 
      ctx.dispatch("/render.jsp"); 
    } 
} 

Java EE 6 и 7 имеют @Asyncronous вызовов методов

и Java EE 7 имеет Concurrency Utilities (управляемый сервис душеприказчика например, что вы можете использовать для отправки задач)