先加个前提.我是google 百度 csdn javaeye过才来提问的.  各位大哥帮忙了 
web项目启动加载一个类的方法
import java.io.IOException;
import java.net.ServerSocket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class NetworkService {
private final ServerSocket serverSocket;
private final ExecutorService pool; public NetworkService(int port, int poolSize) throws IOException {
serverSocket = new ServerSocket(port);
pool = Executors.newFixedThreadPool(poolSize);
} public void serve() {
try {
System.out.println("server ready");
for (;;) {
pool.execute(new Handler(serverSocket.accept()));
}
} catch (IOException ex) {
pool.shutdown();
}
}
}
spring 如果 这样配置. 
 <bean id="networkService" init-method="serve" class="com.huateng.accorecard.common.integration.NetworkService">
  <constructor-arg index="0" type="int">
  <value>19001</value>
  </constructor-arg>
  <constructor-arg index="1" type="int">
  <value>10</value>
  </constructor-arg>
 </bean>
结果是Web项目无法完成启动.  应该是在等serve() 方法返回   问.有没有办法.加载这个方法而不影响主线程呢?

解决方案 »

  1.   

    主线程是web 容器喔.. 好像不大可能.!
    容俺仔细想想再来.!
      

  2.   

    你可以把构造函数中的代码移到另外一个函数中,比如函数叫做init。然后再<bean id="networkService" init-method="serve" class="com.huateng.accorecard.common.integration.NetworkService" init-method="init">这样init方法就会执行,然后你加上异常处理,就不影响整个spring的启动。
      

  3.   

    回2楼.谢谢.回3楼.  注意看下我的写法.呵呵.和你说的是一样的吧.  只不过名字不叫init
    产生不能正常启动的原因是.那个for会一直挂在那.spring在等它执行结束再往下走..  我晕了.想不到办法了
      

  4.   

    serve没有任何返回值啊   
      

  5.   

    这是个线程池.   主要是建立一个socket阻塞.   当然不管返回了.呵呵
      

  6.   

    直接在构造函数中调用service方法不可以么?
       public NetworkService(int port, int poolSize) throws IOException {
            serverSocket = new ServerSocket(port);
            pool = Executors.newFixedThreadPool(poolSize);
            serve();
        }
      

  7.   

    楼上不还是死循环吗?
    在serve()方法里再开个线程去执行
    那个for循环逻辑,这样主线程就可以继续往下执行,
    不会影响web容器的启动
    楼主要给我100分哦    
      

  8.   

    另外.要强调个问题.这个线程开了之后..就不要再开其它线程.  而且.这个for是没办法省略了.   伤心呀.当初怎么把基础打牢呢.... 
      

  9.   

    晕倒.还是成功了.   注释写的不好.  没看清楚.    我把结果写下NetworkService 类.我实现了Runnable 接口之后在run方法里面加上个public void run(){
        serve();
    }
    然后在spring里面改为 <bean id="networkService" class="com.huateng.accorecard.common.integration.NetworkService">
      <constructor-arg index="0" type="int">
      <value>19001</value>
      </constructor-arg>
      <constructor-arg index="1" type="int">
      <value>10</value>
      </constructor-arg>
     </bean>

    <bean id="serverService" init-method="start" class="java.lang.Thread">
    <constructor-arg>
    <ref bean="networkService"/>
    </constructor-arg>
    </bean>
    伤心.还是认真去看基础了马上结帖.人人有份.