2015-02-09 3 views
0

Я бег v4 Spring MVC приложения с пружинной безопасностью 3,2 Я пытаюсь запустить независимую нить от контроллераSpring запустить независимый поток

@Controller 
    public class C1{ 
     @AutoWired 
     C2 c2; 

     @RequestMappting("/") 
     public String home(){ 
      c2.run(); 
      System.out.println("something"); 
      return "home"; 
     } 
    } 
} 

@Component 
@Scope 
public class C2 extends Thread{ 
    @Override 
    public void run(){ 
    while(true){ 
     System.out.println("random stuff"); 
    } 
    } 
} 

, когда я запускаю этот код он застревает в c2.run(); на следующем строка не выполняется; То, что я пытаюсь достичь здесь, это печатать, что random stuff непрерывно и визуализировать home.jsp страницу
Что я делаю неправильно, как исправить это ???

+1

Try 'c2.start()' вместо 'c2.run()' –

ответ

1

Чтобы начать тему, что нужно вызвать метод start() на тему. Make После chages в код:

@Controller 
    public class C1{ 
     @AutoWired 
     C2 c2; 

     @RequestMapping("/") 
     public String home(){ 
      c2.start(); 
      System.out.println("something"); 
      return "home"; 
     } 
    } 
} 

@Component 
@Scope 
public class C2 extends Thread{ 
    @Override 
    public void run(){ 
    while(true){ 
     System.out.println("random stuff"); 
    } 
    } 
} 

Также отметим, что поток будет работать бесконечно.

1

c2.run() просто вызывает метод, он не запускает нить. Так он будет работать только один раз. Для начала темы обратитесь к java documentation.

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

Вы также получили опечатку: RequestMappting должен быть RequestMapping

+0

Это для тестирования. Я не собираюсь это использовать. спасибо за ответ, хотя – LynAs

2

Нет необходимости использовать потоки непосредственно при использовании Spring Framework. Он имеет отличную абстракцию Task Execution and Scheduling, которую следует использовать. Так что вы можете достичь.

@Controller 
public class C1{ 
    @AutoWired 
    C2 c2; 

    @RequestMappting("/") 
    public String home(){ 
     c2.run(); 
     System.out.println("something"); 
     return "home"; 
    }   
} 

@Component 
@Scope 
public class C2{ 

    @Async 
    public void run(){ 
    while(true){ 
     System.out.println("random stuff"); 
    } 
    } 
} 

@Configuration 
@EnableAsync 
public class AppConfig implements AsyncConfigurer { 

@Override 
public Executor getAsyncExecutor() { 
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
    executor.setCorePoolSize(7); 
    executor.setMaxPoolSize(42); 
    executor.setQueueCapacity(11); 
    executor.setThreadNamePrefix("MyExecutor-"); 
    executor.initialize(); 
    return executor; 
} 

@Override 
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { 
    return MyAsyncUncaughtExceptionHandler(); 
} 

}

+0

хорошее предложение. но я снова застреваю в одном месте. любая идея почему? – LynAs

+1

Если его застрял, то выполнение не в новом потоке. Поэтому, чтобы мой пример работал правильно, вам нужно настроить выполнение задания Spring либо с помощью .xml, либо java-config. – Babl

+0

Спасибо за ваш ответ, не могли бы вы разместить образец кода для java config ?? – LynAs

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