zoukankan      html  css  js  c++  java
  • 开启服务器,自动加载类是否需要开辟新的线程研究

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

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

    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掉,是一直存在的。

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


  • 相关阅读:
    English Training Material
    SingleThreadModel is deprecated in Servlet API version 2.4
    What is the difference Apache (Http Server) and Tomcat (Servlet Container)
    Add a stylesheet link programmatically in ASP.NET
    Detail in Response.redirect and Server.transfer in ASP.NET
    @font-face usage
    实习面试总结(只写了昨天腾讯的面试和拿到offer的一个小公司, 有空再把前面的补上吧)
    redis-cli启动问题
    关于结构体内存对齐
    memcpy 和 memmove
  • 原文地址:https://www.cnblogs.com/hainange/p/6153655.html
Copyright © 2011-2022 走看看