1

我正在使用 Spring 3.2 在 Java 中进行聊天项目。

通常在Java中我可以创建一个这样的线程:

public class Listener extends Thread{
    public void run(){
         while(true){

         }
    }
}

并通过启动线程start()

但是Spring 3.x是否有任何特殊的类或任何特殊的方式来实现线程功能?


我的要求:

我有 2 个电信域服务器。在我的应用程序中,我需要初始化服务器以创建协议。

服务器初始化后,我需要启动两个线程来监听电信域服务器的响应。

我所做的如下:

public class Listener extends Thread{
    public void run(){

       while(true){
           if(ServerOne.protocol != null){
                Message events = ServerOne.protocol.receive();
                   //Others steps to display the message in the view
           }
       }

    }
}

是否可以使用 java 线程功能quartz

如果可能的话,哪个更好?如果没有,是什么原因?

希望我们的堆栈成员能提供更好的解决方案。

4

4 回答 4

6

Spring 的 TaskExecutor 是在托管环境中运行这些线程的好方法。您可以参考http://static.springsource.org/spring/docs/3.0.x/reference/scheduling.html获取一些示例。

于 2013-07-02T13:34:59.623 回答
1

您可以使用 Spring 的ThreadPoolTask​​Executor
您可以在配置文件中定义您的执行程序

<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor" destroy- method="shutdown">
  <property name="corePoolSize" value="2" />
  <property name="maxPoolSize" value="2" />
  <property name="queueCapacity" value="10" />
</bean>

<task:annotation-driven executor="taskExecutor" />

在你的Listener你可以有一个方法来完成它的所有工作,并用 @Async 注释来注释这个方法。当然,Listener也应该是Spring管理的。

public class Listener{

    @Async
    public void doSomething(){

       while(true){
           if(ServerOne.protocol != null){
                Message events = ServerOne.protocol.receive();
                   //Others steps to display the message in the view
           }
       }

    }
}

现在每次doSomething调用时,如果执行程序运行的线程数少于corePoolSize线程数,将创建一个新线程。一旦创建了线程数,只有在运行(非空闲)线程多于但少于运行(非空闲)线程且线程队列已满corePoolSize时,每个后续调用doSomething才会创建一个新线程。有关池大小的更多信息可以在java 文档中阅读corePoolSizemaxPoolSize

注意:在使用 @Async 时,如果 CGLIB 库在您的应用程序中不可用,您可能会遇到以下异常。

Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.

为了在不添加 CGLIB 依赖项的情况下克服这个问题,您可以创建一个IListener包含 doSomething() 的接口,然后Listener实现IListener

于 2013-07-02T15:47:39.550 回答
1

Java 有你需要的东西。我建议不要手动使用 Thread。您应该始终使用为您管理线程的东西。请看看这个:https ://stackoverflow.com/a/1800583/2542027

于 2013-07-02T13:35:34.343 回答
1

从 Spring 3 开始,您可以使用 @Schedule 注解:

@Service
public class MyTest {
  ...
  @Scheduled(fixedDelay = 10)
  public getCounter() {...}
}

和 在上下文文件<context:component-scan base-package="ch/test/mytest"><task:annotation-driven/>

请参考本教程:http ://spring.io/blog/2010/01/05/task-scheduling-simplifications-in-spring-3-0/

于 2013-10-18T07:17:39.463 回答