Spring运行独立的线程

时间:2015-02-09 09:38:10

标签: java multithreading spring

我正在运行带有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页面 我做错了怎么解决这个问题???

3 个答案:

答案 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");
    }
  }
}

另请注意,该线程将无限运行。