我正在运行带有spring security 3.2的v4 Spring mvc应用程序 我试图从控制器运行一个独立的线程
@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页面
我做错了怎么解决这个问题???
答案 0 :(得分:2)
使用Spring Framework时无需直接使用Threads。它有一个很好的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();
}
}
答案 1 :(得分:1)
c2.run()
只是调用方法,它不会启动线程。所以它只运行一次。请参考java documentation开始一个帖子。
此处还有其他问题需要考虑,例如您是否真的想在每次请求页面时启动新的后台线程,以及是否希望它进入您所说明的资源密集型循环。
您还有一个拼写错误:RequestMappting
应为RequestMapping
答案 2 :(得分:1)
要启动线程,您需要在线程上调用start()
方法。
对您的代码进行以下操作:
@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");
}
}
}
另请注意,该线程将无限运行。