开启服务器,自动加载类是否需要开辟新的线程研究

本文通过实验探讨了在Web应用中如何在服务器启动时自动加载特定类,并分析了线程使用对类加载顺序的影响。通过实例展示了如何避免死循环问题及优化类加载策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有些应用需要在开启服务器的时候自动先加载自己写好的类。比如监听串口通信等等。

那么在开启服务钱对类的加载是否需要开辟一个新的线程呢。下面对该想法做了一下测试。

1.首先在web.xml添加要加载的类:

<servlet>
<servlet-name>startup</servlet-name>
<servlet-class>com.env.persistence.util.DataBufferReader</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet>
<servlet-name>startup2</servlet-name>
<servlet-class>com.env.persistence.util.DataBufferReader2</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>

这里我想加载DataBufferReader,DataBufferReader2,有顺序加载。对两个类进行测试。

2.在对应的包下面创建两个类,代码如下:

DataBufferReader:
public class DataBufferReader extends HttpServlet {

@Override
public void init() throws ServletException {
while(true){
System.out.println("11111");
}
}

}
DataBufferReader2:

public class DataBufferReader2 extends HttpServlet {
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
System.out.println("222222");

}
}

DataBufferReader是一个死循环。DataBufferReader2是一个简单显示函数。

测试结果DataBufferReader2没被加载,web访问服务器失败。

接着对DataBufferReader进行改进:

public class DataBufferReader extends HttpServlet {

@Override
public void init() throws ServletException {
// TODO Auto-generated method stub

Start st=new Start();
Thread thread=new Thread(st);
thread.start();
}
class Start implements Runnable{
public void run() {
// TODO Auto-generated method stub
while(true){
System.out.println("!!!");
}
}
}
}

DataBufferReader把死循环加载进一个线程里面。DataBufferReader2执行,web可以访问服务器。

接着对DataBufferReader再进行试验:

public class DataBufferReader extends HttpServlet {

@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
Timer timer=new Timer();
timer.schedule(new TimerTask(){

@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("!!!!!!!!!!!!");
}

},0, 1000);

}

}
DataBufferReader方法改为定时执行。DataBufferReader2执行,web可以访问服务器。
得出结论只要不是死循环,连续执行的方法不用开线程。只要满足程序能够分得被时间片加载完整即可,不过有一种情况需要就是需要加载的方法很费时,为了不影响加载速度需要开启一个新的线程,特殊情况特殊处理。

PS:按照java的官方文档说明,Timer类会自动启动一个新线程,而多个Timer类则会有开辟多个线程,同时Timer类的线程是非daemon(守护)线程,所以一旦启动除非明确cancel掉,是一直存在的。

以上均是个人测试的小例子,可能在大的应用中并不是这样加载层序,在此仅供菜鸟学习。忘批评指正。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值