Rumah > Soal Jawab > teks badan
有一个使用场景,在用户一次的访问中,我向steam的dota2接口请求了20条用户的最近比赛记录,然后传到jsp渲染了,我想把这20条记录存在数据库中,这个操作比较耗时,就新开了一个线程这样做会不会导致线程安全问题,好像不推荐在servlet中新开线程?还有其他的解决方案吗?
模拟代码
@RequestMapping("/thread")
@ResponseBody
public String actionThread(){
Thread t=new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
System.out.println("数据库操作");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
return "nihao";
}
谢谢各位 查了文档用了springmvc容器级的taskexecutor ,可以限制线程数目和等待队列的大小。
<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/>
<task:executor id="myExecutor" pool-size="5-10" queue-capacity="100" rejection-policy="CALLER_RUNS"/>
<task:scheduler id="myScheduler" pool-size="10"/>
@Async
public void test(String s){
try {
Thread.currentThread().sleep(5000);
System.out.println("test asny"+s);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
阿神2017-04-17 14:46:44
不要再controller里面再开线程,可以把远程访问来的数据放到缓存中,比如ehcache或者memcache,先判断缓存是否有以及时间戳,符合要求,就从缓存读取,否则远程访问获取