springboot启动时如何开启多线程?
今日,博主遇到一个问题,就是在写项目的时候,用springboot启动项目时要启动另外一个udp服务,结合我同事的代码,因为他以前是部署在tomcat下运行的,但是我不想那么麻烦,想直接jar包运行,所以只得重新想办法。现在把这2种方式都贴出来,相当于做一个笔记。
tomcat启动:
/**
* Spring Boot核心启动类
*/
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@Slf4j
public class CoreApplication extends SpringBootServletInitializer implements CommandLineRunner {
@Value("${udp.port}")
private int udpPort;
public static Thread thread;
public static void main(String[] args)
{
SpringApplication sa = new SpringApplication(CoreApplication.class);
sa.addListeners(new CloseListener());
sa.run(args);
//SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
// 注意这里要指向原先用main方法执行的Application启动类
builder.listeners(new CloseListener());
return builder.sources(CoreApplication.class);
}
@Override
public void run(String... args) {
//新开线程避免阻塞Tomcat的启动
thread = new Thread(){
public void run(){
Common.udpProverbServer = new UdpProverbServer();
try {
log.info("smartHomeCore UDP"+udpPort+"启动成功");
Common.udpProverbServer.run(udpPort);
//new UdpProverbServer().run(udpPort);
}catch (Exception e){
log.error("smartHomeCore UDP启动失败");
Common.udpProverbServer.stop();
//new UdpProverbServer().stop();
}
}
};
thread.start();
}
/**
* 程序停止事件监听器
*/
public static class CloseListener implements ApplicationListener<ContextClosedEvent> {
@Override
public void onApplicationEvent(ContextClosedEvent event) {
thread.interrupt();
//Common.udpProverbServer.stop();
log.info("程序和UDP服务停止");
}
}
上面的方法就是改装的SpringApplication,直接在这里面新增一个线程,然后运行相关的代码。
我的做法,就是改变原来需要多开的那个类。
/**
* Netty实现UDP通信核心-服务端
*/
@Component
@Slf4j
@Configuration
public class UdpServer implements DisposableBean, Runnable {
@Value("${udp.server.port}")
public int udpPort;
public EventLoopGroup group;
private Thread thread;
private volatile boolean someCondition = true;
UdpServer() {
this.thread = new Thread(this);
this.thread.start();
}
private void udpRun() throws Exception{
group = new NioEventLoopGroup();
Bootstrap b = new Bootstrap();
log.info("udp服务开始启动:启动端口为 {}",udpPort);
//由于我们用的是UDP协议,所以要用NioDatagramChannel来创建
b.group(group).channel(NioDatagramChannel.class)
//支持广播
.option(ChannelOption.SO_BROADCAST, true)
//ChineseProverbServerHandler是业务处理类
.handler(new UdpProverbServerHandler());
b.bind(udpPort).sync().channel().closeFuture().await();
}
private void stop() {
group.shutdownGracefully();
group.shutdown();
}
@Override
public void destroy() throws Exception {
someCondition =false;
}
@Override
public void run() {
try {
while (someCondition){
udpRun();
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String [] args) throws Exception{
new UdpServer().run();
}
就是利用类的构造方法,直接多开一个线程。
1.本站所有资源收集于互联网,仅用于学习和研究,若用于违法,与本站无关,仅限学习交流请勿用于商业用途。
2.会员在本站下载的VIP素材后,只拥有使用权,著作权归原作者及49vps所有。
3.VIP素材,未经合法授权,会员不得以任何形式发布、传播、复制、转售该素材,否则一律封号处理。
4.如果素材损害你的权益,请联系客服删除。
49资源网 » springboot启动时如何开启多线程?
49资源网 » springboot启动时如何开启多线程?